状态 f[i, j] 表示已经决定前 i 种物品的选取,总 need 不超过 j;
状态转移方程 f[i, j] = max{f[i, j – need[i]] + val[i], f[i – 1, j]};
结果的状态表示为 f[n, m]。
注意状态方程与01背包的区别,这个区别反映了物品能取一个还是无穷个。
反映到代码上的区别就是内层循环的次序不同。
#include <iostream> #include <algorithm> using namespace std; int f[100005]; int main() { int n, m; cin >> n >> m; int val, need; for (int i = 0; i < n; i++) { cin >> need >> val; for (int j = need; j <= m; j++) { f[j] = max(f[j], f[j - need] + val); } } cout << f[m] << endl; return 0; }
REF:背包问题九讲
时间: 2024-12-06 07:18:37