描述

小偷在屋子里偷东西,他带着一只背包。屋子里物品数量有限——每件物品都具有一定的重量和价值——珠宝重量轻但价值高,桌子重但价值低。最重要的是小偷背包容量有限。很明显,他不能把桌子分成两份或者带走珠宝的3/4。对于一件物品他只能选择带走或者不带走。

那么问题就是小偷怎样偷才能获得最大价值的商品?

分析

有如下的商品价格和重量:编号重量W价格V134

245

356

在商店中有上面3件商品,然后用b(k,w)来表示小偷能获得的最大价值k代表的是第一个商品

w代表的背包剩余的空间

那么问题就变成求b(K,W)的最大值的问题,而小偷对待每一个商品首先有一个问题:背包剩余的空间能不能在装下这个商品,不能的话b(k,w)=b(k-1,w);当能偷(不一定偷)的时候又判断怎么样才能最大值,那么有下图:

现在开始从头分析:

我们首先面对的是B(3,10),对待商品3,我们选择偷还是不偷,当然偷啊

那么问题就变成了求B(2,5)+6的最大值问题,然后再判断B(2,5)的最大值,依次递归,求得最大值核心算法应该是求上面的B(max)

具体实现

我们刚刚是从最大空间到最小空间,写代码的时候可以从最小到最大空间,可以得到这样一个表格:

x轴表示某一个商品,0就是代表没有商品,y轴代表的是最大容纳的重量

可以简单的得到,商品数量为0或者是剩余的重量是0时候,B的值都是0,而且只有第一件商品的时候,B的值都是4

完整代码1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37public static void (String[] args){

int maxW = 10;

int number = 3;

int w[] = {3, 4, 5};

int v[] = {4, 5, 6};

int[][] b = backPackSolution(maxW, number, w, v);

for (int i = 0; i <= number; i++) {

for (int j = 0; j <= maxW; j++) {

System.out.print(b[i][j]+"t");

}

System.out.println();

}

}

private static int[][] backPackSolution(int maxW, int number, int[] w, int[] v) {

int b[][] = new int[number + 1][maxW + 1];

// 相当于遍历商品

for (int i = 1; i < number + 1; i++) {

// j代表剩余的空间

for (int j = 1; j < maxW + 1; j++) {

// 这件商品和剩余空间进行比较

if (w[i - 1] < j) {

// 小于表示可以偷,现在决定怎么偷

if (b[i - 1][j] < (b[i - 1][j - w[i - 1]] + v[i - 1])) {

b[i][j] = b[i - 1][j - w[i - 1]] + v[i - 1];

} else {

b[i][j] = b[i - 1][j];

}

} else {

// 不偷了

b[i][j] = b[i - 1][j];

}

}

}

return b;

}

打印可得下面的数据:

0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 4 4 4 4 4 4 4

0 0 0 0 4 5 5 5 9 9 9

0 0 0 0 4 5 6 6 9 10 11

参考

背包问题最大价值java,背包问题Java实现相关推荐

  1. 动态规划在求解背包问题中的应用(JAVA)--回溯法、记忆化法

    动态规划在求解背包问题中的应用 背包问题向来是动态规划的典型问题,给定n个重量为w1,w2,...,wn,价值为v1,v2,...,vn的物品和一个称重量为W的背包,求这些物品中最优价值的一个子集,且 ...

  2. jni调用java类_JNI之C++调用Java类 —— java.lang.String

    JNI之C++调用Java类 -- java.lang.String 为什么要用C++调用Java类?很难回答,写着文章只是觉得JNI很有意思.于是开始编写一段使用VC++在Windows系统里调用j ...

  3. 基础背包问题 - 多维有界背包问题 - 深度优先搜索 (递归)

    基础背包问题 - 多维有界背包问题 - 深度优先搜索 (递归) 1. 基础背包问题 背包问题 (Knapsack problem) 是一种组合优化的 NP 完全问题.给定一组物品,每种物品都有自己的重 ...

  4. 2019年最新Java和Java工程师发展现状解析,了解一下?

    本文为大家全面解析当前时代Java和Java工程师的行业现状,市场发展及就业薪资等内容,帮你更好的了解行业趋势. 一.生活中,无处不在的Java 只要能够接触到互联网就离不开Java,我们大部分人看到 ...

  5. JNI之C++调用Java类 ——java.lang.String

    JNI之C++调用Java类 --java.lang.String 为什么要用C++调用Java类?很难回答,写着文章只是觉得JNI很有意思.于是开始编写一段使用VC++在Windows系统里调用ja ...

  6. java unlimited_具有无限参数的Java方法(Java method with unlimited arguments)

    具有无限参数的Java方法(Java method with unlimited arguments) Spring框架使用方法,您可以根据需要传递尽可能多的参数. 我想写一个函数,也可以采取无限量的 ...

  7. 介绍java -cp java -jar的区别

    java -cp 和 -classpath 一样,是指定类运行所依赖其他类的路径,通常是类库,jar包之类,需要全路径到jar包,window上分号";" java -cp &am ...

  8. 【Java】Java连接Mysql数据库的demo示例

    [Java]Java连接Mysql数据库的demo示例 1.安装mysql数据库 2.下载java-mysql-connector.jar包 3.完成java配置 4.写java代码运行测试 1.安装 ...

  9. java抓取网页标题内容_[Java教程]java 网页页面抓取标题和正文

    [Java教程]java 网页页面抓取标题和正文 0 2014-07-10 09:01:30 import java.io.BufferedReader;import java.io.IOExcept ...

  10. Java基础-Java中的堆内存和离堆内存机制

    Java基础-Java中的堆内存和离堆内存机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 转载于:https://www.cnblogs.com/yinzhengjie/p/9 ...

最新文章

  1. 这么简单的目标检测赛题,竟然设置260万现金奖!
  2. R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(改变图例位置、移除图例)实战
  3. 【Linux系统编程学习】Linux进程控制原语(fork、exec函数族、wait)
  4. Mysql复制-Slave库设置复制延迟
  5. java变量数据类型_java变量与数据类型
  6. 【数据结构与算法】浅谈队列的应用
  7. azure 使用_使用Azure的低成本灾难恢复解决方案
  8. java基数排序_Java实现基数排序
  9. 汇编语言 王爽 【第四版】 第一章 检测点1.1
  10. 谷歌浏览器批量图片下载插件-合成pdf
  11. 软件工程-第三章-需求分析
  12. 封装0805跟0603有什么区别,只存在大小的区别么???
  13. 【装机首选】惠普笔记本台式机专用系统 GHOSTXPSP3 v2013.06 海驱版
  14. 信息最全--MySQL循环插入测试用户数据--姓名
  15. 延时关机命令 linux,Ubuntu自动定时关机的方法
  16. mysql升级 增删改查询
  17. 笔记本和利用服务器算力直连,使用闲置服务器的CPU算力挖掘Monero—Windows篇
  18. 如何用 XMind 做商业计划书?
  19. 西门子TIA博途软件多版本共存安装教程
  20. 交换机的主要技术指标

热门文章

  1. Matlab/Cplex代码:基于合作型Stackelberg博弈的考虑差别定价和风险管理的微网运行策略
  2. js 中eval用法
  3. Self-Supervised Difference Detection for Weakly-Supervised Semantic Segmentation
  4. 深入理解 rootLogger、logLogger、qtLogger
  5. 武汉ISO27001认证需满足这个硬性要求才能快速通过
  6. 大根堆与小根堆的理解,如何手写一个堆,以及什么时候用自己手写的堆,什么时候用语言提供堆的api,(二者的区别)
  7. JS模块化(CommomJS规范和ES6规范)
  8. 【论文精读】NeRF —— 解读《NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis》
  9. HSC490控制器调试笔记(一)
  10. 达梦数据库携手中地数码 强强联合促进国产软件大发展