C++代码完成以下编程任务:使用贪心算法实现0-1背包问题的求解,测试数据随机生成,相同程序重复执行 100 次以测试效率
时间: 2024-03-12 16:44:37 浏览: 78
以下是使用贪心算法实现0-1背包问题的C++代码:
```c++
#include <iostream>
#include <vector>
#include <algorithm>
#include <ctime>
#include <cstdlib>
using namespace std;
struct Item {
int weight;
int value;
};
bool cmp(Item a, Item b) {
return a.value * 1.0 / a.weight > b.value * 1.0 / b.weight;
}
int knapsack(vector<Item>& items, int capacity) {
sort(items.begin(), items.end(), cmp);
int n = items.size();
int current_weight = 0;
int total_value = 0;
for (int i = 0; i < n; i++) {
if (current_weight + items[i].weight <= capacity) {
current_weight += items[i].weight;
total_value += items[i].value;
} else {
int remain_capacity = capacity - current_weight;
total_value += items[i].value * remain_capacity * 1.0 / items[i].weight;
break;
}
}
return total_value;
}
int main() {
srand(time(nullptr));
const int NUM_TESTCASES = 100;
const int MAX_CAPACITY = 100;
const int MAX_ITEM_WEIGHT = 10;
const int MAX_ITEM_VALUE = 10;
for (int i = 0; i < NUM_TESTCASES; i++) {
int capacity = rand() % MAX_CAPACITY + 1;
int num_items = rand() % 10 + 1;
vector<Item> items(num_items);
for (int j = 0; j < num_items; j++) {
items[j].weight = rand() % MAX_ITEM_WEIGHT + 1;
items[j].value = rand() % MAX_ITEM_VALUE + 1;
}
int result = knapsack(items, capacity);
cout << "Test case " << i + 1 << ": capacity=" << capacity << ", items=";
for (int j = 0; j < num_items; j++) {
cout << "(" << items[j].weight << ", " << items[j].value << ") ";
}
cout << "result=" << result << endl;
}
return 0;
}
```
上述代码中,我们使用了一个 `Item` 结构体表示背包中的每个物品,其中 `weight` 表示物品的重量,`value` 表示物品的价值。我们还定义了一个 `cmp` 函数用于按照单位价值从高到低排序。在 `knapsack` 函数中,我们首先按照单位价值从高到低对物品进行排序,然后依次将物品加入背包,直到背包已满为止。如果当前物品无法完全放入背包中,则将其部分放入背包,并终止循环。
为了测试效率,我们随机生成了 100 个测试样例,每个样例包含随机的背包容量和物品种类,物品的重量和价值也是随机的。我们使用 `srand` 函数来设置随机数种子,确保每次运行程序生成的测试样例都不同。最后,我们依次对每个测试样例进行求解,并将结果输出到标准输出流中。
阅读全文