01背包的重点即是状态转移方程
让我们来一起过一遍题目:
有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。
第 i件物品的体积是 v,价值是 w。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
请你输出最大价值。
他的状态转移方程是:
f [ i ][ j ] = max( f [ i - 1 ][ j ], f [ i-1 ] [ j - v [ i ] ]+ w [ i ] )
在这之中f [ i ][ j ] :表示在我们所有的选择办法的集合中,只从i个物品中选,并且总占用体积不大于j的选法的集合,
它的值是这个集合中任意一个选法的最大值.
所以我们根据这个方程直接上代码就可以了
#include <bits/stdc++.h> using namespace std; const int N = 1001; int n, m; int v[N], w[N]; int f[N][N]; int main() { cin >> n >> m; for(int i = 1; i <= n; i++) cin >> v[i] >> w[i]; for(int i = 1; i <= n; i++) { for(int j = 0; j <= m; j++) { f[i][j] = f[i-1][j]; if(j>=v[i]) f[i][j] = max(f[i][j], f[i-1][j-v[i]]+w[i]); } } cout << f[n][m] << endl; return 0; }
标签:件物品,int,选法,01,背包,随记 From: https://www.cnblogs.com/ViolentForTy0917/p/16928120.html