贪心算法-分数背包问题

2024-08-22 14:52

本文主要是介绍贪心算法-分数背包问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

贪心算法与分数背包问题详解

目录

  • 贪心算法与分数背包问题详解
    • 贪心算法简介
    • 分数背包问题
      • 问题分析
      • 算法步骤
      • 流程图
      • 代码实现(C++)
      • 总结
    • C++学习资源

贪心算法简介

贪心算法是一种在每一步选择中都采取在当前状态下最好或最优的选择,从而希望导致结果是全局最好或最优的算法策略。它在有最优子结构的问题中尤为有效。

分数背包问题

与0-1背包问题不同,分数背包问题允许将物品的部分装入背包。这意味着我们可以将一个物品分割成任意大小,并根据其重量比例来计算其价值。

问题分析

  1. 单位价值:每个物品的单位价值是其价值与重量的比值,即val[i-1] / wgt[i-1]
  2. 贪心选择:按照单位价值从高到低对物品进行排序,然后依次考虑每个物品。

算法步骤

  1. 排序:将所有物品按照单位价值从高到低排序。
  2. 贪心循环:遍历排序后的物品列表,对于每个物品:
    • 如果物品重量小于等于剩余容量,将整个物品装入背包。
    • 如果物品重量大于剩余容量,只装入能够适应当前容量的部分。

流程图

物品重量小于等于容量
减少背包容量
物品重量大于容量
开始
初始化物品数组
对物品数组进行排序
初始化结果变量res
遍历排序后的物品数组
添加物品价值到res
继续遍历
计算剩余容量能装的价值
添加计算结果到res
结束遍历
返回最大价值res
结束

代码实现(C++)

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;class Item {
public:int w; // 物品重量int v; // 物品价值Item(int w, int v) : w(w), v(v) {}
};bool compare(Item a, Item b) {return (double)a.v / a.w > (double)b.v / b.w;
}double greedyFractionBag(vector<int>& wgt, vector<int>& val, int cap) {vector<Item> items(wgt.size());for (int i = 0; i < wgt.size(); i++) {items[i] = Item(wgt[i], val[i]);}sort(items.begin(), items.end(), compare);double res = 0;for (auto& item : items) {if (item.w <= cap) {res += item.v;cap -= item.w;} else {res += (double)item.v / item.w * cap;break;}}return res;
}int main() {vector<int> w = {10, 20, 30, 40, 50};vector<int> v = {50, 120, 150, 210, 240};int c = 50;cout << "Maximum value: " << greedyFractionBag(w, v, c) << endl;return 0;
}

总结

贪心算法在解决分数背包问题时展示了其高效性。通过合理地排序和贪心选择,我们可以得到一个接近或达到最优解的方案。


C++学习资源

以下是我学习C++觉得不错的资料,仅供学习
匠心精作C++从0到1入门编程-学习编程不再难
链接: https://pan.baidu.com/s/1q7NG28V8IKMDGD7CMTn2Lg?pwd=ZYNB 提取码: ZYNB
第二套、侯捷老师全系列八部曲 - 手把手教你进阶系列
链接: https://pan.baidu.com/s/1AYzdguXzbaVZFw1tY6rYJQ?pwd=ZYNB 提取码: ZYNB

这篇关于贪心算法-分数背包问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1096585

相关文章

MySQL 设置AUTO_INCREMENT 无效的问题解决

《MySQL设置AUTO_INCREMENT无效的问题解决》本文主要介绍了MySQL设置AUTO_INCREMENT无效的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录快速设置mysql的auto_increment参数一、修改 AUTO_INCREMENT 的值。

关于跨域无效的问题及解决(java后端方案)

《关于跨域无效的问题及解决(java后端方案)》:本文主要介绍关于跨域无效的问题及解决(java后端方案),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录通用后端跨域方法1、@CrossOrigin 注解2、springboot2.0 实现WebMvcConfig

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码

Java死锁问题解决方案及示例详解

《Java死锁问题解决方案及示例详解》死锁是指两个或多个线程因争夺资源而相互等待,导致所有线程都无法继续执行的一种状态,本文给大家详细介绍了Java死锁问题解决方案详解及实践样例,需要的朋友可以参考下... 目录1、简述死锁的四个必要条件:2、死锁示例代码3、如何检测死锁?3.1 使用 jstack3.2

解决JSONField、JsonProperty不生效的问题

《解决JSONField、JsonProperty不生效的问题》:本文主要介绍解决JSONField、JsonProperty不生效的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录jsONField、JsonProperty不生效javascript问题排查总结JSONField

github打不开的问题分析及解决

《github打不开的问题分析及解决》:本文主要介绍github打不开的问题分析及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、找到github.com域名解析的ip地址二、找到github.global.ssl.fastly.net网址解析的ip地址三

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地

springboot加载不到nacos配置中心的配置问题处理

《springboot加载不到nacos配置中心的配置问题处理》:本文主要介绍springboot加载不到nacos配置中心的配置问题处理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录springboot加载不到nacos配置中心的配置两种可能Spring Boot 版本Nacos

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socket read timed out的问题

《如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socketreadtimedout的问题》:本文主要介绍解决Druid线程... 目录异常信息触发场景找到版本发布更新的说明从版本更新信息可以看到该默认逻辑已经去除总结异常信息触发场景复