- 01背包(一维数组优化)
#include<iostream> using namespace std; const int N = 110;%物品数量 int v[N], w[N], f[N];%分别是物品的体积,价值,当前状态的最大价值 int main() { int n = 0, m = 0; 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 = m; j >= v[i]; j--) //从大到小 { f[j] = max(f[j], f[j - v[i]] + w[i]); } cout << f[m]; return 0; }
3件物品,有体积和价值,背包最大体积为10
-
完全背包问题(二维数组优化)
#include<iostream> using namespace std; const int N = 100;%物品数量 const int N = 1e4;%背包容量 int v[N], w[N], f[N][N]; int main() { int m, n; cin >> m >> n; for (int i = 1; i <= n; i++) { cin >> v[i] >> w[i];%输入物品体积和价值 } for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) { f[i][j] = f[i - 1][j]; if (j >= v[i]) { f[i][j] = max(f[i][j], f[i][j - v[i]] + w[i]); } } cout << f[n][m];%前n个物品,容量为m的最大价值 }
-
多组背包问题(先分组,在01背包)
#include<iostream> using namespace std; const int N = 1010; int m, n; int f[N], v[N][N], w[N][N], s[N], y[N]; int main() { int cnt = 0, M = 0, x = 0, MAX = 0; cin >> m >> n; for (int i = 1; i <= n; i++) { int a, b, c; cin >> a >> b >> c; int j = 1; while (v[c][j] != 0) { j++; } v[c][j] = a; w[c][j] = b; y[c]++; j = 1; MAX = max(MAX, c); } for (int i = 1; i <= MAX; i++) { for (int j = m; j >=0; j--) { for (int k = 1; k <= y[i]; k++) { if (j >= v[i][k]) { f[j] = max(f[j], f[j - v[i][k]] + w[i][k]); } } cout << f[j] << endl; } } return 0; } /* for (int i = 1; i <= MAX; i++) { for (int j = 1; j <=m; j++) { for (int k = 1; k <= y[i]; k++) { if (j >= v[i][k]) { f[i][j] = f[i - 1][j]; f[i][j]= max(f[i][j], f[i - 1][j - v[i][k]] + w[i][k]); } } } } cout << f[n][m]; */
背包问题合集(动态规划方法)
最新推荐文章于 2025-05-27 21:52:10 发布