#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int v[200],c[200];
int dp[30000];
int main()
{
int n,t;
int i,j,k;
int cas=1;
while(scanf("%d%d",&n,&t),(n+t))
{
memset(dp,-1,sizeof(dp));
dp[0]=0;
for(i=0;i<n;i++)
{
scanf("%d",&v[i]);
}
for(i=0;i<n;i++)
{
scanf("%d",&c[i]);
}
for(i=0;i<n;i++)
{
int tot=c[i];
for(j=1;j<=tot;j*=2)
{
tot-=j;
int add=v[i]*j;
for(k=20000;k>=add;k--)
{
if(dp[k-add]!=-1)
{
if(dp[k]==-1) dp[k]=dp[k-add]+j;
else
{
dp[k]=min(dp[k],dp[k-add]+j);
}
}
}
}
if(tot!=0)
{
int add=v[i]*tot;
for(k=20000;k>=add;k--)
{
if(dp[k-add]!=-1)
{
if(dp[k]==-1) dp[k]=dp[k-add]+tot;
else
{
dp[k]=min(dp[k],dp[k-add]+tot);
}
}
}
}
}
//printf("%d.....\n",dp[5]);
int ok=0;
int ans=100000;
int anst=t;
while(dp[t]==0) t++;
if(t<=20000)
{
for(i=t;i<=20000;i++)
{
if(dp[i]!=-1&&dp[i-anst]!=-1)
{
ok=1;
ans=min(ans,dp[i]+dp[i-anst]);
//printf("%d %d %d %d %d\n",i,i-anst,dp[i],dp[i-anst],ans);
}
}
}
if(ok==1) printf("Case %d: %d\n",cas++,ans);
else printf("Case %d: -1\n",cas++);
}
return 0;
}
hdu 3591 The trouble of Xiaoqian(多重背包)
原文:http://www.cnblogs.com/sola1994/p/4691077.html