hdu 2191 珍惜现在,感恩生活(多重背包)
题意:
有N元经费,M种大米,每种大米有单袋价格p元,单袋重量h,以及对应袋数c。
问最多可以买多重的大米。
思路:
经典多重背包,用二进制的方法。
看代码
代码:
struct node{ int price,weight,num; } obj[105]; int dp[105]; int n,m; void MultiplePack(int cost,int value,int amount){ if(cost*amount>=n){ rep(i,cost,n) dp[i]=max( dp[i],dp[i-cost]+value ); return; } int k=1; while(k<amount){ rep2(i,n,k*cost) dp[i]=max( dp[i],dp[i-k*cost]+k*value ); amount -= k; k *= 2; } rep2(i,n,amount*cost) dp[i]=max( dp[i],dp[i-amount*cost]+amount*value ); } int main(){ int T; cin>>T; while(T--){ cin>>n>>m; rep(i,1,m) cin>>obj[i].price>>obj[i].weight>>obj[i].num; mem(dp,0); rep(i,1,m){ MultiplePack(obj[i].price,obj[i].weight,obj[i].num); } cout<<dp[n]<<endl; } return 0; }