c++DP:01 背包(0/1 Knapsack)
作者:野牛程序员:2025-11-10 07:44:22C++阅读 2206
c++DP:01 背包(0/1 Knapsack)
✅ 功能说明
每件物品只有一次选择机会,求最大价值。
✅ 代码模板
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, W;
cin >> n >> W; // n = 物品数量, W = 背包容量
vector<int> weight(n+1), value(n+1);
// 读入每件物品的重量与价值
for(int i=1; i<=n; i++){
cin >> weight[i] >> value[i];
}
// dp[j] 表示容量为 j 时能获得的最大价值
vector<int> dp(W+1, 0);
// 01 背包:容量必须从大到小更新,确保每物品只使用一次
for(int i=1; i<=n; i++){
for(int j=W; j>=weight[i]; j--){
dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
}
}
cout << dp[W] << "\n"; // 输出最大价值
return 0;
}✅ 输入样例
4 5 1 2 2 4 3 4 4 5
含义
| 物品 | 重量 | 价值 |
|---|---|---|
| 1 | 1 | 2 |
| 2 | 2 | 4 |
| 3 | 3 | 4 |
| 4 | 4 | 5 |
✅ 输出样例
8
最优方案
选择重量 1 + 2 + 3,价值 2 + 4 + 4 = 10
但容量仅 5
选择 2 + 3 → 4 + 4 = 8
最佳值 = 8
野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892

