标签:
状态 f[i, j] 表示已经决定了前 i 个物品的选取情况,总费用不超过j;
状态转移方程 f[i, j] = max{f[i – 1, j], f[i – 1, j – need[i]] + value[i]};
最终解的状态表示 f[n, m]。
注意到状态转移只需用到上层的两个状态,所以可以将状态降维进行空间压缩。
由于j – need[i] < j,所以每层j从大向小计算状态。
#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 = m; j >= need; j--) { f[j] = max(f[j], f[j - need] + val); } } cout << f[m] << endl; return 0; }
标签:
原文地址:http://www.cnblogs.com/xblade/p/4458209.html