题目意思是求出硬币的组合方案,使得硬币的总价值不超过价值m。
DP问题,可以转换成求多重背包的方案数目。直接套模板就可以了,思想可以看DD大牛的《背包九讲》一文。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<utility>
#include<string>
#include<set>
#include<vector>
#include<stack>
#include<algorithm>
#include<queue>
#include<cstdlib>
#include<map>
#include<cmath>
using namespace std;
const int M=100010;
const int inf=1<<29;
int cout;
bool bag[M];
int used[M],c[M],v[M];
int n,m;
void work()
{
int i,j;
memset(bag,0,sizeof(bag));
bag[0]=1;
for(i=1;i<=n;i++)
{
memset(used,0,sizeof(used));
for(j=v[i];j<=m;j++)
if(!bag[j] && bag[j-v[i]] && used[j-v[i]]<c[i])
{
bag[j]=true;
used[j]=used[j-v[i]]+1;
cout++;
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)==2)
{
if(n+m==0) break;
int i,j;
cout=0;
for(i=1;i<=n;i++)
scanf("%d",&v[i]);
for(i=1;i<=n;i++)
scanf("%d",&c[i]);
work();
printf("%d\n",cout);
}
return 0;
}