背包问题最大价值java,背包问题Java实现
描述
小偷在屋子里偷东西,他带着一只背包。屋子里物品数量有限——每件物品都具有一定的重量和价值——珠宝重量轻但价值高,桌子重但价值低。最重要的是小偷背包容量有限。很明显,他不能把桌子分成两份或者带走珠宝的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实现相关推荐
- 动态规划在求解背包问题中的应用(JAVA)--回溯法、记忆化法
动态规划在求解背包问题中的应用 背包问题向来是动态规划的典型问题,给定n个重量为w1,w2,...,wn,价值为v1,v2,...,vn的物品和一个称重量为W的背包,求这些物品中最优价值的一个子集,且 ...
- jni调用java类_JNI之C++调用Java类 —— java.lang.String
JNI之C++调用Java类 -- java.lang.String 为什么要用C++调用Java类?很难回答,写着文章只是觉得JNI很有意思.于是开始编写一段使用VC++在Windows系统里调用j ...
- 基础背包问题 - 多维有界背包问题 - 深度优先搜索 (递归)
基础背包问题 - 多维有界背包问题 - 深度优先搜索 (递归) 1. 基础背包问题 背包问题 (Knapsack problem) 是一种组合优化的 NP 完全问题.给定一组物品,每种物品都有自己的重 ...
- 2019年最新Java和Java工程师发展现状解析,了解一下?
本文为大家全面解析当前时代Java和Java工程师的行业现状,市场发展及就业薪资等内容,帮你更好的了解行业趋势. 一.生活中,无处不在的Java 只要能够接触到互联网就离不开Java,我们大部分人看到 ...
- JNI之C++调用Java类 ——java.lang.String
JNI之C++调用Java类 --java.lang.String 为什么要用C++调用Java类?很难回答,写着文章只是觉得JNI很有意思.于是开始编写一段使用VC++在Windows系统里调用ja ...
- java unlimited_具有无限参数的Java方法(Java method with unlimited arguments)
具有无限参数的Java方法(Java method with unlimited arguments) Spring框架使用方法,您可以根据需要传递尽可能多的参数. 我想写一个函数,也可以采取无限量的 ...
- 介绍java -cp java -jar的区别
java -cp 和 -classpath 一样,是指定类运行所依赖其他类的路径,通常是类库,jar包之类,需要全路径到jar包,window上分号";" java -cp &am ...
- 【Java】Java连接Mysql数据库的demo示例
[Java]Java连接Mysql数据库的demo示例 1.安装mysql数据库 2.下载java-mysql-connector.jar包 3.完成java配置 4.写java代码运行测试 1.安装 ...
- java抓取网页标题内容_[Java教程]java 网页页面抓取标题和正文
[Java教程]java 网页页面抓取标题和正文 0 2014-07-10 09:01:30 import java.io.BufferedReader;import java.io.IOExcept ...
- Java基础-Java中的堆内存和离堆内存机制
Java基础-Java中的堆内存和离堆内存机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 转载于:https://www.cnblogs.com/yinzhengjie/p/9 ...
最新文章
- 这么简单的目标检测赛题,竟然设置260万现金奖!
- R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(改变图例位置、移除图例)实战
- 【Linux系统编程学习】Linux进程控制原语(fork、exec函数族、wait)
- Mysql复制-Slave库设置复制延迟
- java变量数据类型_java变量与数据类型
- 【数据结构与算法】浅谈队列的应用
- azure 使用_使用Azure的低成本灾难恢复解决方案
- java基数排序_Java实现基数排序
- 汇编语言 王爽 【第四版】 第一章 检测点1.1
- 谷歌浏览器批量图片下载插件-合成pdf
- 软件工程-第三章-需求分析
- 封装0805跟0603有什么区别,只存在大小的区别么???
- 【装机首选】惠普笔记本台式机专用系统 GHOSTXPSP3 v2013.06 海驱版
- 信息最全--MySQL循环插入测试用户数据--姓名
- 延时关机命令 linux,Ubuntu自动定时关机的方法
- mysql升级 增删改查询
- 笔记本和利用服务器算力直连,使用闲置服务器的CPU算力挖掘Monero—Windows篇
- 如何用 XMind 做商业计划书?
- 西门子TIA博途软件多版本共存安装教程
- 交换机的主要技术指标
热门文章
- Matlab/Cplex代码:基于合作型Stackelberg博弈的考虑差别定价和风险管理的微网运行策略
- js 中eval用法
- Self-Supervised Difference Detection for Weakly-Supervised Semantic Segmentation
- 深入理解 rootLogger、logLogger、qtLogger
- 武汉ISO27001认证需满足这个硬性要求才能快速通过
- 大根堆与小根堆的理解,如何手写一个堆,以及什么时候用自己手写的堆,什么时候用语言提供堆的api,(二者的区别)
- JS模块化(CommomJS规范和ES6规范)
- 【论文精读】NeRF —— 解读《NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis》
- HSC490控制器调试笔记(一)
- 达梦数据库携手中地数码 强强联合促进国产软件大发展