标签:des style blog http os io 数据 for
1 8 2 2 100 4 4 100 2
400
解题思路:
这个能够做模板。
代码:
#include <iostream> #include <algorithm> #include <string.h> using namespace std; const int maxn=102;//有多少种物品 const int inf=0x7fffffff; int cost[maxn];//每种的花费(每袋的价格) int value[maxn];//每种的价值(每袋的重量) 减去花费而换取价值,求最大价值 int num[maxn];//每种的数量(每种的袋数) int f[maxn];//动态数组 int v;//最大容量 void ZeroOnePack(int cost,int value)//01背包 { for(int i=v;i>=cost;i--) f[i]=max(f[i],f[i-cost]+value); } void CompletePack(int cost ,int value)//全然背包 { for(int i=cost;i<=v;i++) f[i]=max(f[i],f[i-cost]+value); } void MultiPack(int cost ,int value,int amount)//多重背包 { if(v<=cost*amount) { CompletePack(cost,value); return; } else { int k=1; while(k<amount) { ZeroOnePack(k*cost,k*value); amount-=k; k*=2; } ZeroOnePack(amount*cost,amount*value); } } int main() { int k;cin>>k; int kindn;//有多少种类 while(k--) { cin>>v>>kindn; for(int i=0;i<kindn;i++) { cin>>cost[i]>>value[i]>>num[i]; } for(int i=0;i<=v;i++) f[i]=-1*inf; f[0]=0; for(int i=0;i<kindn;i++) MultiPack(cost[i],value[i],num[i]); cout<<f[v]<<endl; } return 0; }
[ACM] hdu 2191 珍惜如今,感恩生活 (多重背包),布布扣,bubuko.com
[ACM] hdu 2191 珍惜如今,感恩生活 (多重背包)
标签:des style blog http os io 数据 for
原文地址:http://www.cnblogs.com/hrhguanli/p/3886995.html