贪心练习:阿里巴巴与十四大盗————背包问题
Posted zkyaaa
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了贪心练习:阿里巴巴与十四大盗————背包问题相关的知识,希望对你有一定的参考价值。
转自:https://blog.csdn.net/qq_34624515/article/details/84583149
问题描述:
假设山洞里有 n 种宝物,每种宝物有一定重量 w 和相应的价值 v ,毛驴运载能力有限,只能运走 m 重量的宝物,
一种宝物只能拿一样,宝物可分割。那么如何使毛驴运 走最大价值的宝物?
问题分析:
【思考过程】
如果选价值量最大的宝物,那重量不一定小,不行;
如果选重量最小的宝物,那价值不一定高,也不行;
每次选取单位重量价值最大的宝物,即每次选择性价比(价值/重量)最高的宝物,达到运载重量 m ,那一定是价值最大的。
【算法设计】
(1)数据结构及初始化。将 n 种宝物的重量和价值存储在结构体 three(含重量、价值、性价比),按性价比从高到底排序。
用 sum 来存储毛驴能够运走的最大价值,初始量为 0。
(2)根据贪心策略,按性价比从大到小选宝物,直到达到毛驴的运载能力。每次选性价比高的物品,判断是否小于 m ,若小于则放入,
sum加上当前宝物的价值,m减去当前宝物的重量;若大于,则取该宝物的一部分 m*p[i] , m=0 ,程序结束。m减少到0,则sum得到最大值。
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int MAXN=10000; 4 double sum=0.0; //记录贪心选择宝物的价值之和 5 struct three{ 6 double w; //每个宝物的重量 7 double v; //每个宝物的价值 8 double p; //性价比=价值/重量 9 }s[MAXN]; 10 bool cmp(three a,three b){ //定义sort的比较类型,按照宝物性价比降序 11 return a.p>a.p; //按照性价比降序排列sort(s,s+n,cmp) 12 } 13 int main(){ 14 int n; //宝物的数量 15 double m; //能运走 m 重量的宝物 16 cin>>n>>m; 17 for(int i=0;i<n;i++){ 18 cin>>s[i].w>>s[i].v; //读入宝物重量和价值 19 s[i].p=s[i].v/s[i].w; 20 } 21 sort(s,s+n,cmp); 22 for(int i=0;i<n;i++){ 23 if(m>s[i].w){ //宝物重量小于承载能力则可以选择 24 m-=s[i].w; 25 sum+=s[i].v; 26 }else{ 27 sum+=m*s[i].p; //不足装入整个宝物,部分装入 28 break; 29 } 30 } 31 cout<<sum<<endl; 32 return 0; 33 }
以上是关于贪心练习:阿里巴巴与十四大盗————背包问题的主要内容,如果未能解决你的问题,请参考以下文章