标签:
#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