1 条题解
-
0
方法一,二维数组结构体:
#include <bits/stdc++.h> using namespace std; struct node { int weight; int value; }; int main() { int M,N; // N是物品数量,M是背包的最大容量 cin >> M >> N; vector<node> bag(N+1); for (int i = 1; i <= N; i++) { cin >> bag[i].weight >> bag[i].value; } // dp[i][j] 表示考虑前 i 个物品,当背包容量为 j 时的最大价值 vector<vector<int>> dp(N + 1, vector<int>(M + 1, 0)); // 填充动态规划表 for (int i = 1; i <= N; i++) { for (int j = 0; j <= M; j++) { if (bag[i].weight>j) { // 当前背包容量不足以放下第 i 个物品 dp[i][j] = dp[i-1][j]; } else { int noload=dp[i-1][j]; //不装入就为上一个的价值 int bagW=bag[i].weight; int basV=bag[i].value ; //装入为:减掉 int load=dp[i-1][j - bagW] + basV; // 选择不装入或装入第 i 个物品,取价值较大的一种情况 dp[i][j] = max(noload, load); } } } // 输出最大价值 cout <<dp[N][M] << endl; return 0; }
- 1
信息
- ID
- 418
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 7
- 标签
- 递交数
- 69
- 已通过
- 15
- 上传者