51nod 1086 多重背包模板

来源:互联网 发布:java怎么解压zip文件 编辑:程序博客网 时间:2024/06/09 16:50

有N种物品,每种物品的数量为C1,C2......Cn。从中任选若干件放在容量为W的背包里,每种物品的体积为W1,W2......Wn(Wi为整数),与之相对应的价值为P1,P2......Pn(Pi为整数)。求背包能够容纳的最大价值。


#include <iostream>#include <cstring>#include <cmath>#include <string>#include<cstring>using namespace std;const int SIZE = 50001;long long dp[SIZE],volume[101],value[101],c[101];int n,v;          //总物品数,背包容量void ZeroOnepark(int val,int vol){     //01背包for (int j =v ;j >= vol;j-- ){dp[j]=max(dp[j],dp[j-vol]+val);}}void Completepark(int val,int vol){      //完全背包for (int j =vol;j <= v;j++ ){dp[j]=max(dp[j],dp[j-vol]+val);}}void Multiplepark(int val,int vol,int amount){    //多重背包if (vol*amount >= v)  Completepark(val,vol);else{int k = 1;while (k < amount){ZeroOnepark(k * val, k * vol);amount -= k;k <<= 1;}if (amount > 0) {ZeroOnepark(amount * val, amount * vol);}}}int main(){while (cin>>n>>v){for (int i = 1 ; i <= n ; i++){cin>>volume[i]>>value[i]>>c[i];      //费用,价值,数量}        memset(dp,0,sizeof(dp));for (int i = 1;i <= n;i++){Multiplepark(value[i],volume[i],c[i]);}cout<<dp[v]<<endl;}return 0;}


0 0
原创粉丝点击