多重背包!利用二进制优化做!最近在看背包九讲,膜拜Tianyi Cui。
#include<stdio.h>
#include<string.h>
#define MAX(a,b) a>b?a:b
#define MAXN 105
int dp[MAXN*1000];
int val[MAXN],num[MAXN];
void ZeroOnePack(int cost,int val,int rest)
{
int i;
for(i=rest;i>=cost;i--)
dp[i]=MAX(dp[i],dp[i-cost]+val);
}
void CompletePack(int cost,int val,int rest)
{
int i;
for(i=cost;i<=rest;i++)
dp[i]=MAX(dp[i],dp[i-cost]+val);
}
int main()
{
int n,m;
int i,j,k,count;
while(scanf("%d%d",&n,&m),(n+m))
{
for(i=0;i<n;i++)
scanf("%d",&val[i]);
for(i=0;i<n;i++)
scanf("%d",&num[i]);
memset(dp,0,sizeof(dp));
count=0;
for(i=0;i<n;i++)
{
if(val[i]*num[i]>=m)
CompletePack(val[i],val[i],m);
else
{
k=1;
while(k<num[i])
{
ZeroOnePack(k*val[i],k*val[i],m);
num[i]-=k;
k<<=1;
}
ZeroOnePack(num[i]*val[i],num[i]*val[i],m);
}
}
for(i=1;i<=m;i++)
if(dp[i]==i)
count++;
printf("%d\n",count);
}
return 0;
}
hdu 2844 Coins
最新推荐文章于 2021-03-26 11:27:03 发布