Description
现在给你n种硬币,每个硬币的价值是a[i],以及此种硬币的数量为c[i],问你能用这些小硬币拼出来几种不同价值的大硬币,使得大硬币的价值在1~m之间。
Sample Input
3 10
1 2 4 2 1 1
2 5
1 4 2 1
0 0
Sample Output
8
4
题解:
楼教主的男人八题之一qwq,听说是叫什么裸的多重背包可行性问题,题解都在注释里了。
1 #include<iostream> 2 #include<cmath> 3 #include<cstring> 4 using namespace std; 5 const int maxn=100001; 6 int w[maxn],num[maxn]; 7 int f[maxn],sum[maxn],ans; 8 int main() 9 { 10 int n,m; 11 while(scanf("%d%d",&n,&m)!=EOF) 12 { 13 if(n+m==0)break; 14 for(int i=1;i<=n;i++) 15 scanf("%d",&w[i]); 16 for(int i=1;i<=n;i++) 17 scanf("%d",&num[i]); 18 memset(f,0,sizeof(f)); 19 f[0]=1;ans=0; 20 for(int i=1;i<=n;i++) 21 { 22 memset(sum,0,sizeof(sum)); 23 for(int j=w[i];j<=m;j++) 24 { 25 //f[j]!=1----当前有位置放物品 26 //f[j-w[i]]!=0----没有空着位置不放 27 //sum[j-w[i]]+1<=num[i]----当前物品放的数量没有超过限制 28 if(!f[j]&&f[j-w[i]]&&sum[j-w[i]]+1<=num[i]) 29 { 30 f[j]=1; 31 sum[j]=sum[j-w[i]]+1; 32 ans++; 33 } 34 } 35 } 36 printf("%d\n",ans); 37 } 38 return 0; 39 }