使用C++设计一个贪心算法的0-1背包问题
时间: 2024-05-16 07:18:19 浏览: 97
下面是使用C++设计的贪心算法的0-1背包问题:
```cpp
#include<iostream>
#include<algorithm>
using namespace std;
struct Item
{
int value;
int weight;
};
bool cmp(Item a, Item b)
{
double ratio1 = (double)a.value / a.weight;
double ratio2 = (double)b.value / b.weight;
return ratio1 > ratio2;
}
double fractionalKnapsack(int W, Item arr[], int n)
{
sort(arr, arr + n, cmp);
int currentWeight = 0;
double finalValue = 0.0;
for (int i = 0; i < n; i++)
{
if (currentWeight + arr[i].weight <= W)
{
currentWeight += arr[i].weight;
finalValue += arr[i].value;
}
else
{
int remainingWeight = W - currentWeight;
finalValue += arr[i].value * ((double)remainingWeight / arr[i].weight);
break;
}
}
return finalValue;
}
int main()
{
Item arr[] = { {60, 10}, {100, 20}, {120, 30} };
int n = sizeof(arr) / sizeof(arr[0]);
int W = 50;
cout << "Maximum value we can obtain = " << fractionalKnapsack(W, arr, n);
return 0;
}
```
在这个例子中,Item结构体表示物品的价值和重量。cmp函数用于比较两个物品的价值/重量比率。fractionalKnapsack函数是贪心算法的主要实现,首先根据价值/重量比率对物品进行排序,然后从最高比率的物品开始,一直添加到背包中直到无法添加为止。如果最后一个物品不能完全放入背包中,则将其分成两部分放入背包中。
在main函数中,我们创建了一个包含三个物品的数组,每个物品都有自己的价值和重量。我们还指定了背包的最大容量为50。最后,我们调用fractionalKnapsack函数并输出结果。
阅读全文