[AcWing] 4. 多重背包问题 I(C++实现)多重背包问题 I模板题
1. 题目
2. 读题(需要重点注意的东西)
思路:
闫式dp分析法
用闫式dp分析法分析多重背包问题
分析过程大致同如下的完全背包问题,完全背包问题是第 i 件物品可以选任意多个,而多重背包问题只限制了第 i 件物品最多选 s[i] 个,加上这条限制即可。
以下是完全背包问题的分析:
3. 解法
---------------------------------------------------解法:无二进制优化---------------------------------------------------
#include<iostream>
using namespace std;
const int N = 1010;
int n,m;
int v[N],w[N],s[N];
int f[N][N];
int main(){
cin >> n >> m;
for(int i = 1;i <= n ;i++) cin >> v[i] >> w[i] >> s[i];
for(int i = 1;i <= n;i++){
for(int j = 1;j <= m;j++){
for(int k = 0;k <= s[i] && j >= k*v[i] ;k++){
f[i][j] = max(f[i][j],f[i-1][j-k*v[i]]+k*w[i]);
}
}
}
cout << f[n][m]<<endl;
return 0;
}
可能存在的问题
4. 可能有帮助的前置习题
5. 所用到的数据结构与算法思想
- 动态规划
- 多重背包问题
6. 总结
多重背包问题 I 模板题,无二进制优化,理解思想并熟记代码。