C++ 贪心算法求解离散背包问题 (时间复杂度分析)
C++ 贪心算法求解离散背包问题 (时间复杂度分析)
本文将使用 C++ 代码实现贪心算法解决离散背包问题,并分析其时间复杂度。
问题描述: 有一个承重为 W 的背包和 n 个物品,它们各自的重量和价值分别是 wi 和 vi (1<=i<=n)。如何选择物品放入背包,使得背包中物品的总价值最大?
贪心算法思路:
贪心算法通过不断选择当前最优解来构建最终的解。在离散背包问题中,我们可以通过计算每个物品的价值密度(价值/重量)来选择最优物品。具体实现步骤如下:
- 计算每个物品的价值密度。
- 对所有物品按照价值密度进行降序排序。
- 从排序后的物品列表中,依次选择物品放入背包,直到背包容量不足。
代码实现:
#include <iostream>
#include <algorithm>
using namespace std;
struct Item {
int weight;
int value;
};
bool cmp(Item a, Item b) {
return a.value * b.weight > a.weight * b.value;
}
double knapsack(Item items[], int n, int W) {
sort(items, items+n, cmp);
double result = 0.0;
for(int i=0; i<n; i++) {
if(W==0) return result;
int wt = min(items[i].weight, W);
result += wt * (double)items[i].value / items[i].weight;
W -= wt;
}
return result;
}
int main() {
int W = 50;
Item items[] = {{10, 60}, {20, 100}, {30, 120}};
int n = sizeof(items) / sizeof(items[0]);
cout << 'Maximum value we can obtain = ' << knapsack(items, n, W);
return 0;
}
时间复杂度分析:
- 对 n 个物品进行排序,时间复杂度为 O(nlogn)。
- 循环遍历排序后的物品列表,时间复杂度为 O(n)。
因此,总的时间复杂度为 O(nlogn)。
总结:
贪心算法是一种简单高效的算法,它通过选择当前最优解来构建最终的解。在离散背包问题中,贪心算法能够在 O(nlogn) 时间内找到一个近似最优解。
原文地址: https://www.cveoy.top/t/topic/osBU 著作权归作者所有。请勿转载和采集!