想看更多的解题报告: http://blog.csdn.net/wangjian8006/article/details/7870410
转载请注明出处:http://blog.csdn.net/wangjian8006
题目大意:有n种硬币,这n种硬币的价值为a[i],第i种硬币的个数为c[i]个,问有多少种方案,使这些硬币加起来等于m
这是一个很裸的多重背包可行性问题
#include<iostream>
using namespace std;
#define MAXV 105
#define MAXM 100005
int weight[MAXV],c[MAXV],f[MAXM],user[MAXM];
int main(){
int i,j,n,m,ans;
while(scanf("%d%d",&n,&m) && n && m){
for(i=1;i<=n;i++)
scanf("%d",&weight[i]);
for(i=1;i<=n;i++)
scanf("%d",&c[i]);
memset(f,0,sizeof(f));
f[0]=1;ans=0;
for(i=1;i<=n;i++){
memset(user,0,sizeof(user));
for(j=weight[i];j<=m;j++){
if(!f[j] && f[j-weight[i]] && user[j-weight[i]]+1<=c[i]){
f[j]=1;
user[j]=user[j-weight[i]]+1;
ans++;
}
}
}
printf("%d\n",ans);
}
return 0;
}