题目:
给出一些价值的硬币,每种硬币有一定的数量,给出一个数m,问用这些硬币可以组合成价值1到m中的几个数。
解析:
用vis数组记录第i个背包用的次数。
代码:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<algorithm>
const double PI=acos(-1);
using namespace std;
const int maxx=200000;
int vis[maxx];
bool dp[maxx];
int v[maxx];
int c[maxx];
int main()
{
int n,m,i,j,k;
while(~scanf("%d%d",&n,&m))
{
int ans=0;
if(n==0 && m==0)
break;
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
scanf("%d",&v[i]);
for(i=1;i<=n;i++)
scanf("%d",&c[i]);
dp[0]=1;
for(i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
for(j=v[i];j<=m;j++)
{
if( dp[j]==0 && dp[j-v[i]]==1 && vis[j-v[i]]<c[i])
{
dp[j]=1;
vis[j]=vis[j-v[i]]+1;
}
}
}
for(i=1;i<=m;i++)
ans+=dp[i];
printf("%d\n",ans);
}
return 0;
}