多重背包之五

#include<iostream>            //多重背包,poj 1742 Coins,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;
}

  

posted on 2011-08-22 12:23  sysu_mjc  阅读(144)  评论(0编辑  收藏  举报

导航