Time Limit: 3000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 660 Accepted Submission(s): 196
#include<bits/stdc++.h> using namespace std; const int INF=0x3f3f3f3f; struct Cake{ int energy,siz,amont; }cakes[220]; struct Truck{ int siz,cost,num; }trucks[220]; int dp1[55000],dp2[55000]; void ZeroOnePack(int cost,int weight,int V,int *dp,int typ){ if(typ==1) for(int i=V;i>=cost;i--){ dp[i]=min(dp[i],dp[i-cost]+weight); } else for(int i=V;i>=cost;i--){ dp[i]=max(dp[i],dp[i-cost]+weight); } } void CompletePack(int cost,int weight,int V,int *dp,int typ){ if(typ==1) for(int i=cost;i<=V;i++){ dp[i]=min(dp[i],dp[i-cost]+weight); } else for(int i=cost;i<=V;i++){ dp[i]=max(dp[i],dp[i-cost]+weight); } } void MultiplePack(int cost,int weight,int amount,int V,int *d,int typ){ if(cost*amount>=V){ CompletePack(cost,weight,V,d,typ); return ; } int k=1; while(amount>k){ ZeroOnePack(cost*k,weight*k,V,d,typ); amount-=k; k*=2; } ZeroOnePack(cost*amount,weight*amount,V,d,typ); } int main(){ int T,n,m,p; scanf("%d",&T); while(T--){ memset(dp1,INF,sizeof(dp1)); memset(dp2,0,sizeof(dp2)); dp1[0]=0; int vv=0,cc=0; scanf("%d%d%d",&n,&m,&p); for(int i=1;i<=n;i++){ scanf("%d%d%d",&cakes[i].energy,&cakes[i].siz,&cakes[i].amont); vv+=cakes[i].energy*cakes[i].amont; } for(int i=1;i<=m;i++){ scanf("%d%d%d",&trucks[i].siz,&trucks[i].cost,&trucks[i].num); cc+=trucks[i].cost*trucks[i].num; } vv=min(50000,vv); for(int i=1;i<=n;i++){ MultiplePack(cakes[i].energy,cakes[i].siz,cakes[i].amont,vv,dp1,1); } cc=min(cc,50000); for(int i=1;i<=m;i++){ MultiplePack(trucks[i].cost,trucks[i].siz,trucks[i].num,cc,dp2,2); } int pos=0; int tmp=INF; for(int i=p;i<=vv;i++){ tmp=min(dp1[i],tmp); } for(int i=1;i<=cc;i++){ if(dp2[i]>=tmp){ pos=i; break; } } if(pos==0){ printf("TAT\n"); }else{ printf("%d\n",pos); } } return 0; } /* 555 5 3 34 1 4 1 9 4 2 5 3 3 1 3 3 5 3 2 3 4 5 6 7 5 5 3 8 */
HDU 5445——Food Problem——————【多重背包】
原文:http://www.cnblogs.com/chengsheng/p/4834928.html