贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。

  贪心算法还是比较好理解的一个算法,以前我也是这样认为的,感觉贪心就是每一步都做到最优解就可以了,但是后来结合问题发现自己的理解存在着一些问题。贪心算法比较经典的题目之一就是单源最短路径问题,这个问题在一些步骤上面我想了很久,有些细节想不通。这个问题以后有机会再讲。本次讲一讲背包问题。

  背包问题就是有若干物品,每个物品有自己的价值和重量。背包有总重量。问题就是怎样将背包装的最大价值。背包问题也分很多种,贪心算法解决的是物品可以拆分的背包问题(就是物品可以分成几份装入)。这个问题用贪心还是比较好解决的。贪心选择是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。此问题就是将每次的放入看成每一步,要想解决问题,就是将每一步都放入最优解。也就是说,每一次的放入都要放入最佳的选择。讲到这里,就要说一说最佳的选择,每一次的放入的最佳的选择就是每次放入的物品都是剩余的物品中价值最大且质量最小的,这里就要引入一个物品的属性,物品的权重值。物品的权重值就是指物品的价值除以物品的质量。所以,本问题的每一次的最佳选择就是每次都选出权重值最大的物品。

  问题的大致思路说完了,下面就讲一讲具体的算法。算法最开始是先声明物品类,因为后面要用到很多的物品属性,如果使用数组会有点麻烦,物品的属性有背包ID,物品价值,物品质量,物品权重值。在声明的时候,只要输入物品的前三个属性就可以了,物品的权重值可以由前三个推导出来。算法的接下来就是将物品的数组按物品的权重值排序,权重值大的排在数组的前面,方便后面的运算。算法的主体就是从数组中取出物品对象,计算比较物品的质量和当前背包剩余重量的大小,如果大于,就计算要放入的百分比。如果小于,就进行下一步的最佳选择。算法的大致思路及时这样。下面粘贴代码:

 1 package sf;2 3 import java.util.Scanner;4 5 public class demo6 6 {7     //选择排序将数组中的bag按权重排序8     public static void sort(Bag[] p)9     {
10         Bag t;
11         for(int i=0;i<p.length;i++)
12         {
13             int max=i;
14             t=p[i];
15             for(int j=i;j<p.length;j++)
16             {
17                 if(t.wi<p[j].wi)
18                 {
19                     t=p[j];
20                     max=j;
21                 }
22             }
23             t=p[i];
24             p[i]=p[max];
25             p[max]=t;
26
27         }
28     }
29     //背包问题(贪心算法)
30     public static void bq(Bag[] p,int k,int w,double v)
31     {
32         if(p[k].weight<w)
33         {
34             v=v+p[k].value;
35             System.out.println(p[k].pid+"全部装入,当前背包价值为"+v);
36             w=w-p[k].weight;
37             bq(p, k+1, w, v);
38         }else{
39             double a=w*p[k].wi;//当前价值
40             v=v+a;
41             System.out.println(p[k].pid+"装入了"+((double)w/p[k].weight)+",当前背包价值为"+v);
42         }
43
44     }
45     public static void main(String args[])
46     {
47         System.out.println("请输入背包的容量w和物品的个数n");
48         Scanner reader = new Scanner(System.in);
49         int w=reader.nextInt();//背包的容量
50         int n=reader.nextInt();//物品的个数
51         Bag[] p=new Bag[n];
52         //10 10 a 10 10 b 10 15 c
53         System.out.println("请依次输入各个物品的重量w和价值v和名称s");
54         int weigth;
55         int value;
56         String pid;
57         for(int i=0;i<n;i++)
58         {
59             weigth=reader.nextInt();
60             value=reader.nextInt();
61             pid=reader.next();
62             p[i]=new Bag(weigth,value,pid);
63         }
64         //System.out.println(z[1]+""+v[1]);
65         sort(p);
66         bq(p,0,w,0.0);
67         for(int i=0;i<n;i++)
68         {
69             System.out.println(p[i].wi+" "+p[i].pid);
70         }
71
72     }
73
74 }
75
76 class Bag
77 {
78     public int weight;//重量
79     public int value;//价值
80     public double wi;//权重
81     public String pid;//背包名称
82     public  Bag(int w,int v,String pid)
83     {
84         this.weight=w;
85         this.value=v;
86         this.pid=pid;
87         this.wi=(double)value/weight;
88     }
89 }

  具体实现的问题大部分都在注释中了,虽然也没有多少注释,还是讲讲吧。在控制台输入的时候,要注意物品是先声明,在使用对象属性。最开始一直报错,想了很久,都是用数组用习惯了,直接就使用数组元素了。排序算法用的是选择,因为选择排序对于元素较少的情况下计算效果还是比较理想的。贪心算法的主体用的是递归。算法的实现还是比较简单的。主要是理解贪心算法的思想,做出每一步都是最优解的选择。

背包问题(贪心算法)相关推荐

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

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

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

    题目 有一个背包,背包容量是M=150.有7个物品,物品可以分割成任意大小. 要求尽可能让装入背包中的物品总价值最大,但不能超过总容量. 思路 具有最优子结构性质和贪心选择性质.只要是所有物品的总重量 ...

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

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

  4. 背包问题 贪心算法 java_JS基于贪心算法解决背包问题示例

    本文实例讲述了JS基于贪心算法解决背包问题.分享给大家供大家参考,具体如下: 贪心算法:在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局 ...

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

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

  6. java编程贪心算法背包问题,贪心算法----部分背包问题(java实现)

    部分背包问题 给定 n 种物品和一个背包.物品 i 的重量是 Wi,其价值为 Vi,背包的容量为 C.在选择物品 i 装入背包时,可以选择物品 i 的一部分,1<= i <=n.问应如何选 ...

  7. 贪心算法 0-1背包c语言,贪心算法0-1背包问题(算法实验代码).pdf

    . 实验三. 0-1 背包问题(贪心算法) 实验代码: #include int max(int a,int b) { if(a>b) return a; else return b; } vo ...

  8. 野生前端的数据结构练习(12)贪心算法

    参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/GreedyAlogrithm 一.贪心算法 贪心算法属于比较简单的 ...

  9. java贪心,java实现贪心算法

    并证明了贪心算法解决此问题的有效性,且进行了实例验证,并进 行了复杂度分析,此算法是解决资源组合规划问题较好的方法. 关键词:贪心算法;java 程序;复杂度分析;...... 数据结构与算法 实验名 ...

最新文章

  1. 邮件Web客户端相关
  2. vue小米商城源代码_微信商城信息管理系统(java后台+小程序)
  3. [BZOJ] 1637: [Usaco2007 Mar]Balanced Lineup
  4. SpringBoot回顾
  5. 【HDU - 1455】Sticks (dfs + 剪枝)
  6. 虚拟化技术--桌面虚拟化(VDI)
  7. java中获取路径_java中获取路径的几种基本的方法
  8. 七牛云存储,图片储存
  9. python语言入门t_Python基础学习
  10. vs编译之连接器工具警告LNK4099的解决
  11. java win10 x64下载地址_javawin10 64位
  12. css cursor 鼠标手势
  13. oracle的join 优化,oracle索引优化之join部分
  14. Windows10 Windows自动更新失败 更新错误代码0x8024002e 无法自动更新
  15. 覆盖率验证——代码覆盖率+功能覆盖率
  16. Linux学习16 软件包和启动项管理
  17. 程序员是一种优秀的男朋友
  18. php调用天气预报接口,PHP调用百度天气接口API实现查询实时天气
  19. Altium Designer差分线设置与蛇形走线详解
  20. SkyWalking 极简入门

热门文章

  1. ggplot2箱式图两两比较_R语言ggplot2箱线图绘图总结
  2. 关于在虚拟机里面共享文件无法成功导入的解决案例
  3. 百度SEO站群仿企鹅音乐APP手机界面模板
  4. Vue时间过滤器(转换时间类型)
  5. python open函数编码_Python基础学习——编码与读写
  6. 批处理打开指定路径下的所有文件
  7. 从区块链中常见的攻击类型谈区块链的隐私与安全
  8. Qt编写物联网管理平台34-地图按钮
  9. 基于51单片机的智能太阳能充电器带自动断开功能proteus仿真原理图PCB
  10. 译文 |《电子人、神经武器和网络指挥》