给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大?与0-1背包问题类似,所不同的是在选择物品i装入背包时,可以选择物品i的一部分( 0≤xi ≤1) ,而不一定要全部装入背包,1≤i≤n。C++代码
时间: 2023-10-03 22:04:16 浏览: 98
以下是一个基于贪心算法的代码实现:
```c++
#include <iostream>
#include <algorithm>
using namespace std;
struct Item {
int weight;
int value;
double ratio;
};
bool compare(Item a, Item b) {
return a.ratio > b.ratio;
}
double fractional_knapsack(int capacity, Item arr[], int n) {
sort(arr, arr + n, compare);
double max_value = 0;
for (int i = 0; i < n; i++) {
if (capacity == 0) {
return max_value;
} else if (capacity >= arr[i].weight) {
max_value += arr[i].value;
capacity -= arr[i].weight;
} else {
max_value += capacity * arr[i].ratio;
capacity = 0;
}
}
return max_value;
}
int main() {
int capacity = 50;
Item arr[] = {{10, 60}, {20, 100}, {30, 120}};
int n = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < n; i++) {
arr[i].ratio = (double)arr[i].value / arr[i].weight;
}
double max_value = fractional_knapsack(capacity, arr, n);
cout << "The maximum value that can be obtained is " << max_value << endl;
return 0;
}
```
其中,`Item` 结构体表示物品的重量和价值,以及它们的比率。`compare` 函数用于对物品按比率从大到小排序。`fractional_knapsack` 函数则是实现贪心算法的主要部分,它首先对物品按比率排序,然后依次将物品装入背包中,直到背包已满或所有物品都已装入。如果背包容量大于等于当前物品的重量,则将整个物品装入背包中;否则,只装入背包中能够容纳的一部分。最后,返回可以获得的最大总价值。
在本例中,我们假设背包容量为50,有三种物品,具体信息如下:
| 物品 | 重量 | 价值 |
|------|------|------|
| 1 | 10 | 60 |
| 2 | 20 | 100 |
| 3 | 30 | 120 |
根据贪心算法,我们首先计算出每个物品的比率。然后,按比率从大到小排序,得到以下物品顺序:
| 物品 | 重量 | 价值 | 比率 |
|------|------|------|------|
| 3 | 30 | 120 | 4.0 |
| 2 | 20 | 100 | 5.0 |
| 1 | 10 | 60 | 6.0 |
接下来,我们依次将物品 3、2、1 装入背包中,直到背包已满。具体过程如下:
1. 将物品 3 的整个重量(30)装入背包中,此时背包容量为 20。
2. 将物品 2 的整个重量(20)装入背包中,此时背包容量为 0。
3. 将物品 1 的一部分(剩余重量为 10)装入背包中,此时背包容量为 0。
最终,我们可以获得的最大总价值为 4.0 * 30 + 5.0 * 20 + 6.0 * 10 = 300。
阅读全文