WY52. 牛牛的背包问题
描述
输入描述
输入包括两行输出描述
输出一个正整数, 表示牛牛一共有多少种零食放法。示例1
输入:
3 10 1 2 4
输出:
8
说明:
三种零食总体积小于10,于是每种零食有放入和不放入两种情况,一共有2*2*2 = 8种情况。C 解法, 执行用时: 2ms, 内存消耗: 356KB, 提交时间: 2019-09-04
#include<stdio.h> #include<math.h> #include<stdlib.h> int main() { int fun(int n,int w,int *p); int n; int *p; long long sum=0,w; long long count; scanf("%d%d",&n,&w); p=(int*)malloc(n*sizeof(int)); for(int i=0;i<n;i++) scanf("%d",(p+i)); for(int j=0;j<n;j++) sum=sum+*(p+j); if(sum<=w) { count=pow(2,n); } else { count=fun(n-1,w,p); } printf("%lld",count); return 0; } int fun(int n,int w,int *p) { if(w<0) { return 0; } else if(n==0) { if(*(p+n)>w) { return 1; } else return 2; } return fun(n-1,w,p)+fun(n-1,w-*(p+n),p); }
C 解法, 执行用时: 2ms, 内存消耗: 356KB, 提交时间: 2019-06-28
#include <stdio.h> #include <stdlib.h> int *v; long long p(int n) { if(n==0) return 1; return 2*p(n-1); } long long f(int i, long long w) { if(w<=0) return 0; if(i==1) { if(w>=v[1]) return 2; else return 1; } return f(i-1,w)+f(i-1,w-v[i]); } int main() { int n,i; long long w,num,wigh; num=0; wigh=0; scanf("%d %lld",&n,&w); v=(int *)malloc(sizeof(int)*(n+1)); for(i=1;i<=n;i++) { scanf("%d",v+i); wigh=wigh+v[i]; } if(wigh<=w) num=p(n); else num=f(n,w); printf("%lld",num); return 0; }