java 0 1背包_浅谈java实现背包算法(0-1背包问题)

0-1背包的问题

背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。问题的名称来源于如何选择最合适的物品放置于给定背包中。

这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。

用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:

f[i][v]=max{ f[i-1][v], f[i-1][v-w[i]]+v[i] }。

public class Bag {

static class Item {// 定义一个物品

String id; // 物品id

int size = 0;// 物品所占空间

int value = 0;// 物品价值

static Item newItem(String id, int size, int value) {

Item item = new Item();

item.id = id;

item.size = size;

item.value = value;

return item;

}

public String toString() {

return this.id;

}

}

static class OkBag { // 定义一个打包方式

List Items = new ArrayList();// 包里的物品集合

OkBag() {

}

int getValue() {// 包中物品的总价值

int value = 0;

for (Item item : Items) {

value += item.value;

}

return value;

};

int getSize() {// 包中物品的总大小

int size = 0;

for (Item item : Items) {

size += item.size;

}

return size;

};

public String toString() {

return String.valueOf(this.getValue()) + " ";

}

}

// 可放入包中的备选物品

static Item[] sourceItems = { Item.newItem("4号球", 4, 5), Item.newItem("5号球", 5, 6), Item.newItem("6号球", 6, 7) };

static int bagSize = 10; // 包的空间

static int itemCount = sourceItems.length; // 物品的数量

// 保存各种情况下的最优打包方式 第一维度为物品数量从0到itemCount,第二维度为包裹大小从0到bagSize

static OkBag[][] okBags = new OkBag[itemCount + 1][bagSize + 1];

static void init() {

for (int i = 0; i < bagSize + 1; i++) {

okBags[0][i] = new OkBag();

}

for (int i = 0; i < itemCount + 1; i++) {

okBags[i][0] = new OkBag();

}

}

static void doBag() {

init();

for (int iItem = 1; iItem <= itemCount; iItem++) {

for (int curBagSize = 1; curBagSize <= bagSize; curBagSize++) {

okBags[iItem][curBagSize] = new OkBag();

if (sourceItems[iItem - 1].size > curBagSize) {// 当前物品大于包空间.肯定不能放入包中.

okBags[iItem][curBagSize].Items.addAll(okBags[iItem - 1][curBagSize].Items);

} else {

int notIncludeValue = okBags[iItem - 1][curBagSize].getValue();// 不放当前物品包的价值

int freeSize = curBagSize - sourceItems[iItem - 1].size;// 放当前物品包剩余空间

int includeValue = sourceItems[iItem - 1].value + okBags[iItem - 1][freeSize].getValue();// 当前物品价值+放了当前物品后剩余包空间能放物品的价值

if (notIncludeValue < includeValue) {// 放了价值更大就放入.

okBags[iItem][curBagSize].Items.addAll(okBags[iItem - 1][freeSize].Items);

okBags[iItem][curBagSize].Items.add(sourceItems[iItem - 1]);

} else {// 否则不放入当前物品

okBags[iItem][curBagSize].Items.addAll(okBags[iItem - 1][curBagSize].Items);

}

}

}

}

}

public static void main(String[] args) {

Bag.doBag();

for (int i = 0; i < Bag.itemCount + 1; i++) {// 打印所有方案中包含的物品

for (int j = 0; j < Bag.bagSize + 1; j++) {

System.out.print(Bag.okBags[i][j].Items);

}

System.out.println("");

}

for (int i = 0; i < Bag.itemCount + 1; i++) {// 打印所有方案中包的总价值

for (int j = 0; j < Bag.bagSize + 1; j++) {

System.out.print(Bag.okBags[i][j]);

}

System.out.println("");

}

OkBag okBagResult = Bag.okBags[Bag.itemCount][Bag.bagSize];

System.out.println("最终结果为:" + okBagResult.Items.toString() + okBagResult);

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/475981.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于Python的应用发布技术

收集如何 将Py应用打包发布的各种技巧: 1.1. 工具 {{{k <yanbo.yuangmail.com> reply-to python-cngooglegroups.com, to python-cngooglegroups.com, date Tue, Apr 1, 2008 at 2:58 PM subject [CPyUG:45605]}}}[http://groups.google.com/group/python-cn/t/24…

LeetCode 第 25 场双周赛(718/1832,前39.2%)

文章目录1. 比赛结果2. 题目1. LeetCode 5384. 拥有最多糖果的孩子 easy2. LeetCode 5385. 改变一个整数能得到的最大差值 medium3. LeetCode 5386. 检查一个字符串是否可以打破另一个字符串 medium4. LeetCode 5387. 每个人戴不同帽子的方案数 hard1. 比赛结果 做出来了 1、2…

target java_java元注解 @Target注解用法

Target&#xff1a;Target说明了Annotation所修饰的对象范围&#xff1a;Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了tar…

云南干旱 谁人受损 心有戚戚 愤怒哀伤

西南大旱&#xff0c;云南旅游无影响 http://www.52uyn.com/xinwen/detail.php?tid9615云南旅游业未受旱情影响http://sogup.com/news/jiaodian/12235.html附其中内容&#xff1a; 为报道旱灾&#xff0c;报社两位同事风尘仆仆从北京、深圳赶来。在从机场开往市区的路上&…

LeetCode 第 187 场周赛(1336/3107,前43.0%)

文章目录1. 比赛结果2. 题目1. LeetCode 5400. 旅行终点站 easy2. LeetCode 5401. 是否所有 1 都至少相隔 k 个元素 medium3. LeetCode 5402. 绝对差不超过限制的最长连续子数组 medium4. LeetCode 5403. 有序矩阵中的第 k 个最小数组和 hard1. 比赛结果 15分钟做出来了 1、2 …

Asp.net 中 Eval 调用后台函数的写法

<%# GetXXX(Eval("ColumnName").ToString())%>转载于:https://www.cnblogs.com/Ken-Cai/archive/2010/05/18/1738375.html

Silverlight 3.0 Isolated Storage 独立存储空间

Silverlight支持一种类似Cookie的独立存储,它是基于客户端的文件系统,每个Silverlight应用程序都被分配了自己的独立的存储空间. 这个存储空间在不同的操作系统下是不同的WindowsXP下 是根据账户来分配的.一般在 C:\Document and Setting\Administrator\Local Setting\Applica…

java线程如何避免死锁_Java面试问题,如何避免Java线程中的死锁?

如何避免Java中的死锁?是流行的Java面试问题之一&#xff0c;也是多线程的流行话题之一。尽管问题看起来很简单&#xff0c;但是一旦深入&#xff0c;大多数Java开发人员就会陷入困境。面试问题以“什么是死锁?”当两个或多个线程正在等待彼此释放所需资源(锁定)并陷入无限时…

LeetCode 1201. 丑数 III(最小公倍数+二分查找)

1. 题目 请你帮忙设计一个程序&#xff0c;用来找出第 n 个丑数。 丑数是可以被 a 或 b 或 c 整除的 正整数。 示例 1&#xff1a; 输入&#xff1a;n 3, a 2, b 3, c 5 输出&#xff1a;4 解释&#xff1a;丑数序列为 2, 3, 4, 5, 6, 8, 9, 10... 其中第 3 个是 4。示例…

2008年最受欢迎的资源top100

fromhttp://topic.csdn.net/u/20090116/14/bbe94537-4d1a-44e3-b4bb-01e8c4bd5998.htmlgoogle北电华为腾讯网易迅雷中兴试题及面试经验 sql语句妙用&#xff0c;各种sql语句的详细用法与讲解 仿QQ2008聊天程序(c#源码) 要想精通java必须看的经典书籍&#xff08;强顶&#x…

java抢单功能_基于消息队列的高并发抢单功能实现方法与流程

本发明涉及嵌入式软件中间件&#xff0c;具体涉及一种基于消息队列的高并发抢单功能实现方法。背景技术&#xff1a;中间件是一种独立的系统软件或服务程序&#xff0c;分布式应用系统借助这种软件在不同的技术之间共享资源&#xff0c;管理计算资源和网络通讯。它在计算机系统…

LeetCode LCP 12. 小张刷题计划(二分查找)

1. 题目 为了提高自己的代码能力&#xff0c;小张制定了 LeetCode 刷题计划&#xff0c;他选中了 LeetCode 题库中的 n 道题&#xff0c;编号从 0 到 n-1&#xff0c;并计划在 m 天内按照题目编号顺序刷完所有的题目&#xff08;注意&#xff0c;小张不能用多天完成同一题&…

java 监控 配置 文件怎么打开_java实现文件变化监控的方法(推荐)

一. spring配置文件&#xff1a;application.xmlxmlns:tx"http://www.springframework.org/schema/tx" xmlns:aop"http://www.springframework.org/schema/aop"xmlns:context"http://www.springframework.org/schema/context" xmlns:dwr"ht…

场景编辑器竣工!

今天接着做XML解析&#xff0c;对那个遍历的结构作了些修改&#xff0c;插入了几个函数。 终于&#xff0c;新的场景编辑器竣工了&#xff01; 一个比较复杂的场景了&#xff0c;用3dsMax制作材质&#xff0c;安排物件位置和所用材质 导出到DirectX中&#xff0c;效果感觉比Max…

将MathType公式转换为Blog可用的LaTeX公式(MD编辑器)

会LaTex语法的同学敲起来还是会快一些的。 符号参考&#xff1a; LaTeX 各种命令&#xff0c;符号Latex所有常用数学符号整理 不会的同学&#xff0c;可以按照以下方式操作&#xff1a; 在MathType内先敲好公式 可以手敲&#xff0c;也可以手写&#xff08;手写调用windows的…

java trim 不好使_Java String trim无效

7 个答案:答案 0 :(得分&#xff1a;49)该网站的源代码显示了特殊的html字符 。尝试在java字符串中搜索或替换以下内容&#xff1a;\u00A0。rank rank.replaceAll("\u00A0", "");应该有效。也许添加一个双\\而不是\。答案 1 :(得分&#xff1a;6)您应该将…

JQuery + Json 练习随笔

早就听说JQuery Ajax的方便快捷以及Json优秀的数据交换&#xff0c;今天有空尝试了一下&#xff0c;菜鸟了一番。对初步的使用也算是有个比较抽象的理解吧。记录之备忘&#xff01; json简介&#xff1a; JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人…

java jxl 写 excel文件_java采用jxl写入一个Excel文件

jxl写入一个excel文件。读取方面请看下面相关链接&#xff0c;上一遍是关于读取excel的。package com.javaer.file;import java.io.File;import java.io.IOException;import jxl.Workbook;import jxl.write.Label;import jxl.write.WritableCellFormat;import jxl.write.Writab…

LeetCode 313. 超级丑数(动态规划)

1. 题目 编写一段程序来查找第 n 个超级丑数。 超级丑数是指其所有质因数都是长度为 k 的质数列表 primes 中的正整数。 示例: 输入: n 12, primes [2,7,13,19] 输出: 32 解释: 给定长度为 4 的质数列表 primes [2,7,13,19]&#xff0c; 前 12 个超级丑数序列为&#xf…

Visual Studio 2010 旗舰版免序列号安装体验

Visual Studio 2010 E文版已经发布多时&#xff0c;由于工作原因没有及早的下载体验&#xff0c;直到前几天园子里的朋友放出了下载简体中文的种子 ed2k://|file|cn_visual_studio_2010_ultimate_x86_dvd_532347.iso|2685982720|4AE6228933DDE49D9BFA4C3467C831C2|/于是决定下来…