贪心练习:阿里巴巴与十四大盗————背包问题

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  } 

 


 

以上是关于贪心练习:阿里巴巴与十四大盗————背包问题的主要内容,如果未能解决你的问题,请参考以下文章

贪心策略背包问题——阿里巴巴与四十大盗

贪心策略背包问题——阿里巴巴与四十大盗

45.贪心算法之一:阿里巴巴与四十大盗的故事

《阿里巴巴与四十大盗》读后感500字

阿里巴巴和四十大盗英文原文

背包问题(上) | 贪心算法与MATLAB程序实现