当前位置: 首页 > news >正文

算法学习笔记(7.1)-贪心算法(分数背包问题)

##问题描述

给定 𝑛 个物品,第 𝑖 个物品的重量为 𝑤𝑔𝑡[𝑖−1]、价值为 𝑣𝑎𝑙[𝑖−1] ,和一个容量为 𝑐𝑎𝑝 的背包。每个物品只能选择一次,但可以选择物品的一部分,价值根据选择的重量比例计算,问在限定背包容量下背包中物品的最大价值。

 

##问题解析

我们可以对物品任意地进行切分,并按照重量比例来计算相应价值

  1. 对于物品 𝑖 ,它在单位重量下的价值为 𝑣𝑎𝑙[𝑖−1]/𝑤𝑔𝑡[𝑖−1] ,简称单位价值。
  2. 假设放入一部分物品 𝑖 ,重量为 𝑤 ,则背包增加的价值为 𝑤×𝑣𝑎𝑙[𝑖−1]/𝑤𝑔𝑡[𝑖−1] 。

 

##贪心策略选定

大化背包内物品总价值,本质上是最大化单位重量下的物品价值

  1. 将物品按照单位价值从高到低进行排序。
  2. 遍历所有物品,每轮贪心地选择单位价值最高的物品
  3. 若剩余背包容量不足,则使用当前物品的一部分填满背包。

 

##代码实现

#python代码示例
class Item :def __init__(self,w,v):self.w = w self.v = vdef fraction_knapsack(wgt,val,cap) :items = [Item(w,v) for w,v in zip(wgt,val)]items.sort(key = lambda x : x.v / x.w,reverse=True)res = 0for item in items :if item.w <= cap :res += item.vcap -= item.welse :res += (item.v / item.w) * cap breakreturn res 
//c++代码示例
class Item
{int w ;int v ;Item(int w,int v) : w(w),v(v){}
} ;double fractionKnapsack(vector<int> &wgt,vector<int> &val,int cap)
{vector<int> items ;for (int i = 0 ; i < wgt.size() ; i++){items.push_back(Item(wgt[i],val[i])) ;}sort(items.begin(),items.end(),[](Item &a,Item &b){return (double)a.v/a.w > (double)b.v/b.w ;});double res = 0 ;for (auto &item : items){if (item.w <= cap){res = res + item.v ;cap = cap - item.w ;}else{res = res + (double)(item.v/item.w) * cap ;break ; }}return res ;}

##正确性验证

单位价值更大的物品总是最优选择,贪心策略一定有效。

 

http://www.lryc.cn/news/363915.html

相关文章:

  • 气膜建筑的施工对周边环境影响大吗?—轻空间
  • 【计算机网络】对应用层HTTP协议的重点知识的总结
  • 30分钟快速入门TCPDump
  • Python | 刷题日记
  • “JS逆向 | Python爬虫 | 动态cookie如何破~”
  • 十.数据链路层——MAC/ARP
  • Linux主机安全可视化运维(免费方案)
  • Vite + Vue 3 前端项目实战
  • python-字符替换
  • 团队项目开发使用git工作流(IDEA)【精细】
  • 爬虫案例实战
  • uniapp uni-popup内容被隐藏问题
  • leetcode155 最小栈
  • 在Ubuntu乌班图上安装Docker
  • 【Redis数据库百万字详解】数据持久化
  • echarts legend. icon的展示
  • PHPstudy情况下上传图片马需要的.htaccess文件
  • 基于最大重叠离散小波变换的PPG信号降噪(MATLAB 2018)
  • Gradio中Button用法及事件监听器click方法使用
  • 【Qt秘籍】[005]-Qt的首次邂逅-创建
  • 亚信安慧AntDB:值得信任的数据产品
  • 超越传统AI 新型多智能体系统MESA,探索效率大幅提升
  • [SWPU 2019]神奇的二维码、buuctf部分web题
  • Python正则表达式匹配中文:深入解析与实战应用
  • 实例Python对比两个word文档并找出不同
  • 2.1 QT随手简记(三)
  • TechM-技术网站
  • SpringBoot: 使用GraalVM编译native应用
  • 9. MySQL事务、字符集
  • 为什么要学习数据结构和算法