贪心算法|Greedy Algorithms(背包问题)

贪心算法是一种用于优化问题的简单、直观的算法。该算法在寻找整体最优解的过程中,每一步都进行最优选择。贪心算法在一些问题上是非常成功的,例如用于压缩数据的霍夫曼编码,或者用于通过图寻找最短路径的Dijkstra算法。然而,在许多问题中,贪婪策略并不能产生最优解。

例如,在下面的动画中,贪心算法寻找和最大的路径。它通过在每个步骤中选择最大的可用数量来实现这一点。然而,贪心算法不能找到最大的和,因为它只根据每一步的信息做出决策,而不考虑整体问题。

贪心算法以达到最大和为目标,在每一步都会选择看起来是最优的即时选择,所以在第二步会选择12而不是3,不会得到包含99的最优解

贪心算法

贪心算法的结构

贪心算法获取特定问题中的所有数据,然后设置规则,在算法的每个步骤中为其中的元素添加到解决方案中。在上面的动画中,数据集是图中的所有数字,规则是在图的每一层选择可用的最大数字。算法构建的解是所有这些选项的和。

如果下面两个属性都为真,则可以使用贪心算法来解决这个问题。

贪心选择属性:通过每一步的最优选择,可以得到全局(全局)最优解。

最优子结构:如果整个问题的最优解包含子问题的最优解,则问题具有最优子结构。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是用贪心算法解决01背包问题的代码实现: ``` #include <iostream> #include <algorithm> using namespace std; // 物品结构体 struct Item { int weight; // 物品重量 int value; // 物品价值 }; // 按照单位重量的价值从大到小排序 bool cmp(Item a, Item b) { return (double)a.value / a.weight > (double)b.value / b.weight; } // 01背包问题贪心算法 double knapsack_greedy(Item arr[], int n, int W) { sort(arr, arr + n, cmp); // 按照单位重量的价值从大到小排序 double total_value = 0; // 总价值 for (int i = 0; i < n; i++) { if (arr[i].weight <= W) { // 若物品可以全部放入背包 total_value += arr[i].value; W -= arr[i].weight; } else { // 若物品放不完,则将部分物品放入背包中 total_value += (double)arr[i].value * W / arr[i].weight; break; } } return total_value; } // 测试代码 int main() { int W = 50; // 背包容量 Item items[] = {{10, 60}, {20, 100}, {30, 120}}; // 物品重量和价值 int n = sizeof(items) / sizeof(items[0]); // 物品数量 double max_value = knapsack_greedy(items, n, W); // 计算最大价值 cout << "最大价值为:" << max_value << endl; return 0; } ``` 以上代码中,我们先定义了一个物品结构体,包含物品的重量和价值,然后实现了一个按照单位重量的价值从大到小排序的比较函数,最后实现了一个贪心算法的函数,计算出最大价值。最后在 main 函数中进行测试,输入背包容量和物品的重量和价值,输出最大价值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值