使用贪心法法求0-1背包问题请用C++语言编程,最后返回最大价值和所选用的物品标号,代码中请加注释
时间: 2024-03-04 17:49:20 浏览: 72
分别使用贪心算法、蛮力法、动态规划法解决分数背包问题和0-1背包问题python源码(带注释).zip
好的,这是使用贪心法求解0-1背包问题的C++代码,注释已加上:
```c++
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Item {
int value, weight, index;
};
// 比较函数,按照单位价值(value/weight)从大到小排序
bool cmp(Item a, Item b) {
double r1 = (double)a.value / (double)a.weight;
double r2 = (double)b.value / (double)b.weight;
return r1 > r2;
}
// 使用贪心法求解0-1背包问题
void knapsack(int W, vector<Item> items) {
// 按照单位价值从大到小排序
sort(items.begin(), items.end(), cmp);
int n = items.size();
int curWeight = 0;
double curValue = 0.0;
vector<int> selectedItems;
// 依次选择单位价值最大的物品,直到背包装满为止
for (int i = 0; i < n; i++) {
if (curWeight + items[i].weight <= W) {
curWeight += items[i].weight;
curValue += items[i].value;
selectedItems.push_back(items[i].index);
}
else {
// 选择部分物品,使得背包装满
int remain = W - curWeight;
curValue += (double)remain * ((double)items[i].value / (double)items[i].weight);
curWeight += remain;
selectedItems.push_back(items[i].index);
break;
}
}
// 输出结果
cout << "Max value: " << curValue << endl;
cout << "Selected items: ";
for (int i = 0; i < selectedItems.size(); i++) {
cout << selectedItems[i] << " ";
}
cout << endl;
}
int main() {
int W = 50; // 背包容量
vector<Item> items = {{60, 10, 1}, {100, 20, 2}, {120, 30, 3}};
knapsack(W, items);
return 0;
}
```
这段代码中,我们使用了一个`Item`结构体来表示每个物品的价值、重量和编号。在`cmp`函数中,我们按照单位价值(value/weight)从大到小排序。在`knapsack`函数中,我们依次选择单位价值最大的物品,直到背包装满为止。如果最后一件物品没有完全放入背包,我们选择部分物品,使得背包装满。最后输出最大价值和所选用的物品标号。
阅读全文