p.s.自用。
题目描述
一个旅行者有一个最多能用m公斤的背包,现在有n件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为C1,C2,...,Cn.若每种物品只有一件求旅行者能获得最大总价值。
输入
第一行:两个整数,M(背包容量,M<=200)和N(物品数量,N<=30);
第2..N+1行:每行二个整数Wi,Ci,表示每个物品的重量和价值。
输出
仅一行,一个数,表示最大总价值。
样例输入 Copy
10 4 2 1 3 3 4 5 7 9
样例输出 Copy
12
思路
本题为01背包问题。
参考答案
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <string>
#include <iomanip>
#define INF 653364
using namespace std;
int main()
{
// 输入
int m, n; // 背包容量,物品数量
cin >> m >> n;
vector<int> weight(n + 1, 0); // 重量
vector<int> value(n + 1, 0); // 价值
for (int i = 1; i <= n; i++)
cin >> weight[i] >> value[i];
// 计算
vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0)); // 价值
for (int i = 1; i <= n; i++) // 物品数
{
for (int j = 1; j <= m; j++) // 重量
{
if (j >= weight[i]) // 放得下
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
else // 放不下,继承
dp[i][j] = dp[i - 1][j];
}
}
// 输出
cout << dp[n][m] << endl;
}