多重背包之五
#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;
}