【问题】给定n个物品和一个容量为C的背包,物品的重量是,其价值为,背包问题(Knapsack problem)是如何选择装入背包的物品,使得装入背包中物品的总价值最大。注意和0/1背包问题的区别,在背包问题中,可以将某种物品的一部分装入背包中,但不可以重复装入。

【想法】用贪心法求解背包问题的关键是如何选定贪心策略,使得按照一定的顺序选择每个物品,并尽可能的装入背包,直到背包装满。至少有三种看似合理的贪心策略:

(1)选择价值最大的物品,因为这可以尽可能地增加背包总价值。但是,虽然每一步选择获得了背包价值的极大增长,但背包容量却可能消耗得太快,使得装入背包的物品个数减少,从而不能保证目标函数达到最大。

(2)选择重量最轻的物品,因为这可以装入尽可能多的物品,从而增加背包的总价值。但是,虽然每一步选择使背包的容量消耗得太慢了,但背包的价值却没能保证迅速增长,从而不能保证目标函数达到最大值。

(3)以上两种贪心策略或者只考虑背包价值的增长,或者只考虑背包容量的消耗,而为了求得背包问题的最优解,需要在背包价值增长和背包容量消耗二者之间寻找平衡。正确的贪心策略是选择单位重量价值最大的物品。

【算法】设背包容量为C,共有 n 个物品,物品重量存放在数组 w [ n ] 中,价值存政仕组 v [ n ]中,问题的解存放在数组x[n]中,贪心法求解背包问题的算法如下。

输人:背包容量 C ,物品重量 w [ n ],物品价值 v [ n ]

输出:数组 x [ n ]

1.改变数组w和v的排列顺序,使其按单位重量价值 v [ i ] / w [ i ] 降序排列;

2.将数组 x [ n ] 初始化为 O;

3.i = 0;

4.循环直到 ( w [ i ] > C )

4.1 将第个物品放人背包: x [ i ] = 1;

4.2 C = C - w [ i ];

4.3 i++

5, x [ i ] = C / w [ i ]。

【算法分析】算法7.7的时间主要消耗在将各种物品按照单位重量的价值从大到小排序。因此,其时间复杂性为 O ( )。
       背包问题与0/1背包问题类似,所不同的是在选择物品 i ( 1≤ i ≤ n )装人背包时,可以选择一部分,而不一定要全部装人背包。背包问题可以用贪心法求解,而0/1背包问题却不能用贪心法求解。事头上,在考虑0/1背句问题时,应比较选择该物品和不选择该物品所导致的方案,然后再做街最优选择,由此导出许多互相重叠的子问题,所以,0/1背包问题适合用动态规划法求解。

【算法实现】设函数KanpSack实现贪心法求解背包问题,简单起见,假设物品已经按照单位重量排序,算法用;Java语言面熟如下:

public class KnapSack {public static void main(String[] args) {int [] w = new int[]{10, 30, 20};int [] v = new int[]{50, 120, 60};int C = 50;KnapSack knapSack = new KnapSack();int value = knapSack.KnapSack(w, v, 3, C);System.out.println("背包获得的最大价值是:"+value);}int KnapSack(int w[ ], int v[ ], int n, int C) {double[] x = new double[10];           //物品可部分装入int maxValue = 0;int i;for (i = 0; w[i] < C; i++) {x[i] = 1;                 //将物品i装入背包maxValue += v[i];C = C - w[i];             //背包剩余容量}x[i] = (double) C / w[i];        //物品i装入一部分maxValue += x[i] * v[i];return maxValue;              //返回背包获得的价值}
}

运行结果如下:

from:算法设计与分析(第2版)——王红梅 胡明 编著——清华大学出版社

算法设计与分析——背包问题(Java)相关推荐

  1. 算法设计与分析(Java实现)—— 动态规划(入门)斐波那契数列

    斐波那契数列 递归 记忆化递归 动态规划 public class dp {//# 递归的的斐波那契数列解决方法 时间复杂度O(2^n)public long fibonacci(int n) thr ...

  2. 图的m色着色问题 回溯法(算法设计与分析)Java

    package demo1;public class Coloring {static int m;//颜色的数量static int[] x;//可行解static int n;//图的顶点个数st ...

  3. 算法设计与分析--01背包问题(动态规划法解决)

    算法设计与分析--01背包问题(动态规划法解决) 参考文章: (1)算法设计与分析--01背包问题(动态规划法解决) (2)https://www.cnblogs.com/2228212230qq/p ...

  4. java实现 库鲁斯卡尔算法 kruskal(算法设计与分析作业)

    java实现 库鲁斯卡尔算法kruskal(算法设计与分析作业) package package1;import java.util.Arrays;public class alg {//判断tar是 ...

  5. 算法设计与分析——活动安排问题(Java)

    [问题]设有n个活动的集合E={1,2,-,n},其中每个活动都要求使用同一资源(如演讲会场),而在同一时间内只有一个活动能使用这一资源.每个活动  都有一个要求使用该资源的起始时间  和一个结束时间 ...

  6. 算法设计与分析——淘汰赛冠军问题(Java)

    [问题]假设有  个选手进行竞技淘汰赛,最后决出冠军的选手,请设计竞技淘汰比赛的过程. [想法]竞技淘汰比赛最自然的想法是将所有选手分成两部分,每部分决出胜者后,让这两个胜者进行比赛,再决出最后的冠军 ...

  7. 算法设计与分析(第4版)

    算法设计与分析(第4版) 算法引论 算法与程序 算法:解决问题的方法或过程 输入 输出 确定性 有限性 程序:算法用某种程序设计语言的具体实现 表达算法的抽象机制 高级程序设计语言 抽象数据类型 描述 ...

  8. 算法设计与分析大师班

    算法设计与分析大师班 算法和数据结构将帮助您破解编码面试(C/C++Java/Python)学习算法数据结构 此视频教程共12.0小时,中英双语字幕,画质清晰无水印,源码附件全 课程英文名:Intro ...

  9. 计算机算法设计与分析考试题,《计算机算法设计与分析》习题及答案

    <计算机算法设计与分析>习题及答案 一.选择题 1.二分搜索算法是利用( A )实现的算法. A.分治策略 B.动态规划法 C.贪心法 D.回溯法 2.下列不是动态规划算法基本步骤的是( ...

  10. 计算机算法设计与分析教学大纲,《算法设计与分析》教学大纲

    <<算法设计与分析>教学大纲>由会员分享,可在线阅读,更多相关<<算法设计与分析>教学大纲(3页珍藏版)>请在人人文库网上搜索. 1.课程编号:&quo ...

最新文章

  1. 向基于Linux的Oracle RAC 10g集群添加新节点
  2. android手机界面管理系统的设计与实现(硕士学位论文).pdf,基于Android系统的手机文件管理器的设计与实现...
  3. wampserver配置服务
  4. 实现接口时@Override注解问题
  5. 通过rpm包安装、配置及卸载mysql的详细过程.
  6. linux产生随机数方法
  7. idea 使用 maven 整合 ssm 框架 实现简单的增、删、改 和 分页查询功能
  8. java jpanel隐藏_java – 绘制JPanel隐藏菜单
  9. DataLoader worker (pid 2287) is killed by signal: Killed. pytorch训练解决方法
  10. M - Corporate Identity(多组字符串匹配问题)
  11. android 图片上传图片 报Socket: Broken pipe
  12. 贪心算法适用条件_贪心算法问题
  13. [阅读笔记]专访刘毅:阿里巴巴云计算平台运维故障分析与排查
  14. 链接脚本(Linker Script)用法解析(二) clear_table copy_table
  15. 【Qt/C++异常笔记】间接寻址级别不同
  16. SpringBoot基础
  17. 华为认证hcia含金量_华为认证那个证书有什么用?
  18. Windows利用cmd循环文件文本内容自动创建对应文件
  19. 火力全开,一网打尽Python常用知识点!
  20. ORB匹配--基于OpenCV

热门文章

  1. 苹果延迟审核怎么办?历时1个月终于上架AppStore!太不容易了!实战!
  2. 【蓝桥杯】~C语言数组排序
  3. excel利用vba批量生成word报告
  4. 【第二周】吴恩达团队AI for Medical Diagnosis课程笔记
  5. AD参数微分非线性(DNL)与积分非线性(INL)
  6. 51单片机蜂鸣器加数码管
  7. 微软苏州集体抵制来自阿里、华为的跳槽者:请停止你的“奋斗逼”行为!
  8. 【Python表白代码】“情话都是我抄来的,想说给你听是真的。”情人节快乐~
  9. rfid考勤系统mysql_RFID智能考勤管理系统
  10. oracle 计算母亲节日期,母亲节,给妈妈一份礼物