写一个c++程序用蛮力法解决0-1背包问题
时间: 2024-09-22 07:09:45 浏览: 44
在C++中,我们可以使用蛮力法(也称为暴力搜索法)来解决0-1背包问题,这是一种动态规划方法。假设我们有一个背包容量W,一组物品,每种物品都有一个重量w[i]和价值v[i],我们要决定如何选取物品才能使得总价值最大。下面是简单的实现步骤:
```cpp
#include <iostream>
#include <vector>
using namespace std;
int knapsack(int W, vector<int>& wt, vector<int>& val, int n) {
// 创建一个二维数组 dp[n+1][W+1]
vector<vector<int>> dp(n + 1, vector<int>(W + 1));
for (int i = 1; i <= n; i++) {
for (int w = 1; w <= W; w++) {
// 如果当前物品超出了背包容量,就不能选
if (wt[i-1] > w)
dp[i][w] = dp[i - 1][w];
else { // 否则,可以选择这个物品或者不选择,取两者价值的最大值
dp[i][w] = max(dp[i - 1][w], dp[i - 1][w - wt[i - 1]] + val[i - 1]);
}
}
}
return dp[n][W]; // 返回背包能承载的最大价值
}
int main() {
int W = 50; // 背包容量
vector<int> wt = {10, 20, 30}; // 物品重量
vector<int> val = {60, 100, 120}; // 物品价值
int n = wt.size(); // 物品种类数
cout << "最大价值: " << knapsack(W, wt, val, n) << endl;
return 0;
}
```
在这个程序中,`knapsack`函数采用动态规划的方式遍历所有可能的组合,计算出在给定背包容量下的最大价值。当物品重量大于剩余背包容量时,不会选择该物品;否则,会选择物品或不选择,取两者价值的最大值。
阅读全文