王道机试指南 例题12.9 珍惜现在,感恩生活
题目:
算法梳理:
这题是“背包问题”的扩展,即“多重背包问题”。
- 多重背包问题
代码:
#include <iostream>
#include <vector>
using namespace std;
int main(){
int t;
cin>>t;
for(int k=0;k<t;k++){
int m,n0;
cin>>m>>n0;
int w0[n0],v0[n0],c0[n0];
for(int i=0;i<n0;i++)
cin>>w0[i]>>v0[i]>>c0[i];
//将k重背包问题转化为0-1背包问题
vector<int> w,v;
for(int i=0;i<n0;i++)
for(int j=0;j<c0[i];j++){
w.push_back(w0[i]);
v.push_back(v0[i]);
}
int n=w.size();//更新物品件数
int dp[m+1];
for(int j=0;j<=m;j++)//初始化dp
dp[j]=0;
for(int i=0;i<n;i++)
for(int j=m;j>=w[i];j--)
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);//状态转移方程
cout<<dp[m]<<endl;
}
return 0;
}
运行结果: