二维费用的背包问题(动态规划)

二维费用的背包问题

有 N 件物品和一个容量是 V 的背包,背包能承受的最大重量是 M

每件物品只能用一次。体积是 vi,重量是 mi,价值是 wi

求解将哪些物品装入背包,可使物品总体积不超过背包容量,总重量不超过背包可承受的最大重量,且价值总和最大。
输出最大价值。

输入格式

第一行三个整数,N,V,M,用空格隔开,分别表示物品件数、背包容积和背包可承受的最大重量。

接下来有 N 行,每行三个整数 vi,mi,wi,用空格隔开,分别表示第 i 件物品的体积、重量和价值。

输出格式

输出一个整数,表示最大价值。

数据范围

0<N1000
0<V,M100
0<vi,mi100
0<wi1000

输入样例

4 5 6
1 2 3
2 4 4
3 4 5
4 5 6

输出样例:

8

解题思路:

遍历N见物品,再从大到小遍历当前背包剩余容量,再从大到小遍历当前可承受的重量,进行状态转移

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <vector>
 4 
 5 using namespace std;
 6 
 7 constexpr int N = 1010;
 8 
 9 int main() {
10     int n = 0;
11     int v = 0;
12     int m = 0;
13     std::cin >> n >> v >> m; // 输入物品数量、背包容量和背包承受的最大重量
14     vector<vector<int>> dp(N, vector<int>(N, 0));
15     for (int i = 1; i <= n; i++) {
16         int volume = 0; // 物品体积
17         int weight = 0; // 物品重量
18         int value = 0; // 物品价值
19         std::cin >> volume >> weight >> value; // 输入物品体积、重量和价值
20         for (int j = v; j >= volume; j--) {
21             for (int k = m; k >= weight; k--) {
22                 dp[j][k] = max(dp[j][k], dp[j - volume][k - weight] + value);
23             }
24         }
25     }
26     std::cout << dp[v][m] << endl;
27     return 0;
28 }
posted @ 2022-04-15 16:57  跳动的休止符  阅读(162)  评论(0)    收藏  举报