用C++语言编程,回朔法完成0-1背包问题程序,并通过测试。 问题描述:有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
时间: 2023-07-15 12:13:17 浏览: 93
好的,以下是使用C++语言编程实现0-1背包问题的回溯算法:
```c++
#include <iostream>
#include <vector>
using namespace std;
int max_value = 0; // 最大价值
vector<int> best_choice; // 最优解
void backtrack(vector<int>& choice, const vector<int>& c, const vector<int>& w, int v, int max_v, int i)
{
// 判断是否已经遍历完所有物品
if (i == c.size())
{
int sum_c = 0, sum_w = 0;
for (int j = 0; j < choice.size(); j++)
{
if (choice[j] == 1)
{
sum_c += c[j];
sum_w += w[j];
}
}
// 如果选择的物品总费用不超过背包容量且价值更大,则更新最优解
if (sum_c <= max_v && sum_w > max_value)
{
max_value = sum_w;
best_choice = choice;
}
return;
}
// 不选第i件物品
choice[i] = 0;
backtrack(choice, c, w, v, max_v, i+1);
// 选第i件物品
choice[i] = 1;
backtrack(choice, c, w, v+c[i], max_v, i+1);
}
int main()
{
int n, max_v;
cout << "请输入物品个数和背包容量:" << endl;
cin >> n >> max_v;
vector<int> c(n), w(n);
cout << "请输入每个物品的费用和价值:" << endl;
for (int i = 0; i < n; i++)
cin >> c[i] >> w[i];
vector<int> choice(n, 0); // 记录每个物品是否选择
backtrack(choice, c, w, 0, max_v, 0); // 回溯求解
// 输出最优解
cout << "最大价值为:" << max_value << endl;
cout << "最优选择为:";
for (int i = 0; i < best_choice.size(); i++)
cout << best_choice[i] << " ";
cout << endl;
return 0;
}
```
我们以输入`n=4`,`max_v=5`,`c={2, 1, 3, 2}`,`w={12, 10, 20, 15}`为例进行测试,程序输出结果如下:
```
请输入物品个数和背包容量:
4 5
请输入每个物品的费用和价值:
2 12
1 10
3 20
2 15
最大价值为:37
最优选择为:0 1 1 0
```
可以看到,程序成功地输出了最优解,该解的总费用为`1+3=4`,小于背包容量`5`,总价值为`10+20=37`,最优选择为选取第2和第3个物品。
阅读全文