poj 1742 Coins
#include<iostream>
using namespace std;
int v[105],c[105],b[100005][2];
int main()
{
int n,m,i,j,count,num;
while(scanf("%d%d",&n,&m),n&&m)
{
memset(b,0,sizeof(b));
for(i=1;i<=n;i++)
scanf("%d",&v[i]);
for(i=1;i<=n;i++)
scanf("%d",&c[i]);
b[0][0]=1;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
b[j][1]=0;
for(j=v[i];j<=m;j++)
if(b[j][0]==0)
{
num=j-v[i];
if(b[num][0]!=0&&b[num][1]<c[i])
{
b[j][0]=1; //b[j][0]=1表示硬币价值之和可以为j
b[j][1]=b[num][1]+1; //b[j][1]表示硬币价值之和达到j时,当前的第i种硬币用了多少次
}
}
}
count=0;
for(i=1;i<=m;i++)
{
if(b[i][0]!=0)
count++;
}
printf("%d\n",count);
}
return 0;
}
多重背包,tle,可能是卡在常数上
#include<iostream> //多重背包,tle,可能是卡在常数上
using namespace std;
int n,m,a[250],c[250],dp[100005],weigh[50000];
int main()
{
while(scanf("%d%d",&n,&m)&&n)
{
for(int i=1;i<=n;++i)
scanf("%d",&a[i]);
int l=1;
for(int i=1;i<=n;++i)
{
scanf("%d",&c[i]);
int j=1,t=c[i];
while(t>=j)
{
weigh[l++]=a[i]*j;
t-=j;
j+=j;
}
weigh[l++]=a[i]*t;
}
memset(dp,0,sizeof(dp));
dp[0]=1;
for(int i=1;i<l;++i)
{
for(int j=m;j>=weigh[i];--j)
dp[j]=max(dp[j],dp[j-weigh[i]]);
}
int s=0;
for(int i=1;i<=m;++i)
s+=dp[i];
printf("%d\n",s);
}
return 0;
}