一.贪心算法

1.贪心算法概念

贪婪算法(Greedy algorithm)是一种对某些求最优解问题的更简单、更迅速的设计技术。用贪婪法设计算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测度作最优选择,而不考虑各种可能的整体情况,它省去了为找最优解要穷尽所有可能而必须耗费的大量时间,它采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题,通过每一步贪心选择,可得到问题的一个最优解,虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪婪法不要回溯。

贪婪算法是一种改进了的分级处理方法。其核心是根据题意选取一种量度标准。然后将这多个输入排成这种量度标准所要求的顺序,按这种顺序一次输入一个量。如果这个输入和当前已构成在这种量度意义下的部分最佳解加在一起不能产生一个可行解,则不把此输入加到这部分解中。这种能够得到某种量度意义下最优解的分级处理方法称为贪婪算法。

2.贪心算法求解思路

基本思路:①建立数学模型来描述问题。②把求解的问题分成若干个子问题。③对每一子问题求解,得到子问题的局部最优解。④把子问题的解局部最优解合成原来解问题的一个解。

实现该算法的过程:从问题的某一初始解出发;while 能朝给定总目标前进一步 do;求出可行解的一个解元素;由所有解元素组合成问题的一个可行解。

3.利用贪婪策略,需要解决的两个问题

确定问题是否能用贪心策略求解;一般来说,适用于贪心策略求解的问题具有以下特点:贪心选择性质和最优子结构性质。

① 贪心选择性质:可通过局部的贪心选择来达到问题的全局最优解。运用贪心策略解题,一般来说需要一步步的进行多次的贪心选择。在经过一次贪心选择之后,原问题将变成一个相似的,但规模更小的问题,而后的每一步都是当前看似最佳的选择,且每一个选择都仅做一次。

② 最优子结构性质:原问题的最优解包含子问题的最优解,即问题具有最优子结构的性质。在背包问题中,第一次选择单位质量最大的货物,它是第一个子问题的最优解,第二次选择剩下的货物中单位重量价值最大的货物,同样是第二个子问题的最优解,依次类推。

二.背包问题

背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。问题的名称来源于如何选择最合适的物品放置于给定背包中。相似问题经常出现在商业、组合数学,计算复杂性理论、密码学和应用数学等领域中。也可以将背包问题描述为决定性问题,即在总重量不超过W的前提下,总价值是否能达到V?它是在1978年由Merkel和Hellman提出的。

题目:有N件物品和一个容量为V的背包。第i件物品的重量是w[i],价值是v[i]。求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。

三.贪心算法求解背包问题

1 importjava.util.Arrays;2

3 /**

4 * 贪心算法--->背包问题5 * 假设有一个背包最大可以装 150kg 物品6 * 某物品 重量 价值(元) 性价比(单位重量的价格)7 * a 35kg 10 10/358 * b 30kg 40 40/309 * c 60kg 30 30/6010 * d 50kg 50 50/5011 * e 40kg 35 35/4012 * f 10kg 40 40/1013 * g 25kg 30 30/2514 *15 * 求:背包可以装入的最大价值?16 *@authorAdministrator17 *18 */

19 public classKnapsack {20 /**

21 * 背包最大容量22 */

23 private static int KNAPSACK_MAX_CAPACITY=150;24 /**

25 * 保存各个物品的重量26 */

27 private static int [] goods_weights=new int [] {35,30,60,50,40,10,25};28 /**

29 * 保存各个物品的价值30 */

31 private static int [] goods_values=new int[] {10,40,30,50,35,40,30};32

33 /**

34 * 贪婪算法实现背包问题求解35 *@paramcapacity 背包容量36 *@paramweights 各个物品的重量37 *@paramvalues 各个物品的价值38 */

39 private void knapsackGreedy(int capacity,int weights[],intvalues[]) {40 int n=weights.length; //物品的数量

41

42 Double[] r=new Double[n]; //保存性价比的数组

43 int [] index=new int[n]; //保存按性价比排序的物品的下标44 //计算得到各个物品的性价比

45 for (int i = 0; i < n; i++) {46 r[i]=(double)values[i]/weights[i];47 index[i]=i; //初始化各个物品的默认性价比排序

48 }49

50 //对各个物品的性价比进行排序

51 for(int i=0;i

58 //将排序后性价比的下标更新为性价比排序后的位置

59 int x=index[i];60 index[i]=index[j];61 index[j]=x;62 }63 }64 }65

66 //将排序好的重量和价值分别保存到数组

67 int [] w1=new int[n];68 int [] v1=new int[n];69 for(int i=0;i

74 //将物品装入背包75 //记录哪些物品已经被装入背包 0 没有装入背包 1 代表已经装入背包

76 int [] x=new int[n];77 int maxValue=0;78 for(int i=0;i

81 x[i]=1; //表示将该物品装入背包

82 System.out.println("物品:"+w1[i]+" 被放进了");83 maxValue+=v1[i];84 capacity-=w1[i];85 }86 }87 System.out.println("总共放下的物品的数量为:"+Arrays.toString(x));88 System.out.println("最大价值为:"+maxValue);89 }90

91

92 public static voidmain(String[] args) {93 Knapsack k=newKnapsack();94 k.knapsackGreedy(KNAPSACK_MAX_CAPACITY, goods_weights,95 goods_values);96 }97 }

四.测试结果

物品:10被放进了

物品:30被放进了

物品:25被放进了

物品:50被放进了

物品:35被放进了

总共放下的物品的数量为:[1, 1, 1, 1, 0, 0, 1]

最大价值为:170

贪心算法 背包问题 java_贪心算法求解背包问题相关推荐

  1. 贪心算法 背包问题 java_贪心算法解背包问题

    背包问题:与0-1背包问题类似,所不同的是在选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部装入背包,1 <= i <= n.这2类问题都具有最优子结构性质,极为相似,但背包问 ...

  2. 贪心算法最短路径java_贪心算法-单源最短路径

    算法思想:贪心算法 实际问题:单源最短路径 编程语言:Java 问题描述 单源最短路径算法,又称迪杰斯特拉算法.其目的是寻找从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题. 算法构 ...

  3. 贪心算法求解背包问题

    问题:给定n个物品和一个容量为C的背包,物品i的重量为w 其价值为v.背包问题就是如何如何选择背包的物品,使装入背包中的物品的总价值是最大的,注意和0/1背包问题的区别,在背包问题中可以将某种物品的一 ...

  4. Java - 初探贪心算法(纸币找零,背包问题)

    贪心算法 1. 什么是贪心算法? 二.贪心算法的基本思路 三.贪心算法适用的问题 四.贪心算法的实现框架 五.贪心策略的选择 六.贪心算法的几个例子 1. 纸币找零问题 2. 背包问题 1. 什么是贪 ...

  5. 完全背包问题贪心算法c语言,数据结构与算法学习之路:背包问题的贪心算法和动态规划算法...

    一.背包问题描述: 有N种物品和一个重量为M的背包,第i种物品的重量是w[i],价值是p[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包重量,且价值总和最大. 二.解决方法: 1.贪心算 ...

  6. c语言背包问题贪心算法,C/C++语言算法篇(一):贪心算法

    贪心算法 正所谓人人都有贪心,C语言算法上的贪心可不是实际意义上的贪心,C语言结构上的贪 心可以说满足两个条件:贪心选择性质和最优子结构性质.满足这两个条件的话就可以尝试用贪心算法解决问题. 贪心选择 ...

  7. 背包问题 贪心算法 java_JS基于贪心算法解决背包问题

    前面我们分享了关于js使用贪心算法解决找零问题,本文我们接着为大家介绍JS基于贪心算法解决背包问题. 贪心算法:在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做 ...

  8. 【贪心算法】阿里巴巴与四十大盗——背包问题与0-1背包问题

    前言 关于贪心算法,我在这篇博客中已经做了简单的介绍.初识贪心算法 下面来介绍一下贪心算法中的一个经典的问题--背包问题 一.问题描述 一天,阿里巴巴赶着一头毛驴上山砍柴,无意间在远处发现了一群盗贼, ...

  9. 贪心法求解背包问题 C++

    1.问题描述 背包问题是给定n个重量为{w1, w2,- ,wn}.价值为{v1, v2, - ,vn}的物品和一个容量为C的背包,求这些物品中的一个最有价值的子集,并且要能够装到背包中每次从物品集合 ...

最新文章

  1. 第二十九课.回声状态网络ESN
  2. java迭代器的使用场景_集合遍历利器 -- 迭代器模式 介绍 使用场景案例 优缺点及程序演示...
  3. sql server2005 出现一个或多个参数无效
  4. 数据库-优化-慢查日志分析工具-pt-query-digest介绍及作用
  5. vue 后台获取数据 下拉框_Vue开发中的一些常见套路和技巧
  6. 马斯克投15亿,价值47000美元的比特币,其实是一群数学家搞出来的……
  7. spock测试_用于混合Spock 1.x和JUnit 5测试的Maven项目设置
  8. Chialisp是什么
  9. Python——元组Tuple
  10. keil5.24 +注册机 下载
  11. python syntax error_python提示Syntax Error报错解决教程
  12. 多个工作表数据汇总怎么做?
  13. 计算机主机后面板 图解,计算机主板揭秘(下)图文并茂版
  14. stack Overflow 的使用
  15. “比特”与“瓦特”深度融合,云计算驶向绿色低碳快车道
  16. css设置div不可编辑,css 怎么设置div不可点击
  17. (五)算法与数据结构 | BFS和DFS
  18. [QQ机器人]nonebot2 聊天插件
  19. 蓝桥杯每日一练:报时助手
  20. 网页自动浏览.刷票.自动留言之登陆篇(VB)

热门文章

  1. 普通青年和文艺青年的差别
  2. GDPU C语言 番外篇
  3. OpenCV学习笔记——HSV颜色空间超极详解inRange函数用法及实战
  4. android 百度地图Map的4.9E-324问题
  5. Eclipse历史版本下载
  6. 两种计算Java对象大小的方法
  7. 洛谷p2006赵神牛的游戏 入门 模拟
  8. Homebrew安装AdoptOpenJDK8的几个注意事项(有更新)
  9. CKEditor5 图片上传
  10. e.printStackTrace() 导致系统卡崩