【算法数据结构Java实现】Java实现动态规划(背包问题)

1.背景

     追随着buptwusuopu大神的脚步,最近在研习动态规划。动态规划应该叫一种解决问题的思想,记得又一次去某公司面试就被问到了这个。

       多于动态规划的理解,大致是这样的,从空集合开始,每增加一个元素就求它的最优解,直到所有元素加进来,就得到了总的最优解。

    

       比较典型的应用就是背包问题,有一个重量一定的包,有若干件物品,他们各自有不同的重量和价值,怎样背才能取得最大价值。

       错误的理解:去价值/重量比最大的物品多装(之前我也是这么想的,但是在背包重量一定的情况下这么做并不合理,范例很容易想到)

2.题目

       要实现的题目是摘抄于另一位大神的博客,讲的很好,可惜不是java实现的,有兴趣可以看下面的引用。

题目描述:

有编号分别为a,b,c,d,e的五件物品,它们的重量分别是2,2,6,5,4,它们的价值分别是6,3,5,4,6,现在给你个承重为10的背包,如何让背包里装入的物品具有最大的价值总和?

name weight value 1 2 3 4 5 6 7 8 9 10
a 2 6 0 6 6 9 9 12 12 15 15 15
b 2 3 0 3 3 6 6 9 9 9 10 11
c 6 5 0 0 0 6 6 6 6 6 10 11
d 5 4 0 0 0 6 6 6 6 6 10 10
e 4 6 0 0 0 6 6 6 6 6 6 6

3.代码实现

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		final int packageWheight=10;//包的重量
		Package[] pg={
		   new Package(6,2,"a"),
		   new Package(3,2,"b"),
		   new Package(5,6,"c"),
		   new Package(4,5,"d"),
		   new Package(6,4,"e")
		};

		int[][] bestValues = new int[pg.length+1][packageWheight+1];

		for(int i=0;i<=pg.length;i++){
			for(int j=0;j<=packageWheight;j++){
				if(i==0||j==0){
					bestValues[i][j]=0;//临界情况
				}
				else{
					if(j<pg[i-1].getWheight()){
						bestValues[i][j] = bestValues[i-1][j];//当第n件物品重量大于包的重量时,最佳值取前n-1件的
					}
					else{
						   int iweight = pg[i-1].getWheight(); //当第n件物品重量小于包的重量时,分两种情况,分别是装第n件或不装,比较取最大
	                        int ivalue = pg[i-1].getValue();
	                        bestValues[i][j] =
	                            Math.max(bestValues[i-1][j], ivalue + bestValues[i-1][j-iweight]);
					}
				}
			}
		}

		System.out.print(""+bestValues[pg.length][packageWheight]);
		}
	}

public class Package {

	int value;
	int wheight;
	String name;
	Package(int value,int wheight,String name){
		this.value=value;
		this.wheight=wheight;
		this.name=name;
	}
	public int getWheight(){
		return wheight;
	}
	public int getValue(){
		return value;
	}
	public String getName(){
		return name;
	}
}

有兴趣的同学可以到我的github去clone这个工程:https://github.com/jimenbian/DynamicPrograme

引用:【1】http://blog.csdn.net/mu399/article/details/7722810

           【2】http://www.cnblogs.com/SDJL/archive/2008/08/22/1274312.html

                 

           【3】http://blog.163.com/guixl_001/blog/static/41764104200863015855721/

/********************************

* 本文来自博客  “李博Garvin“

* 转载请标明出处:http://blog.csdn.net/buptgshengod

******************************************/

时间: 2024-10-22 06:49:35

【算法数据结构Java实现】Java实现动态规划(背包问题)的相关文章

算法 数据结构 java-以下java的最短路径算法应该如何实现

问题描述 以下java的最短路径算法应该如何实现 不知道怎么用额. 解决方案 http://blog.csdn.net/javaman_chen/article/details/8254309 解决方案二: http://download.csdn.net/detail/gareth_liao/5100648 解决方案三: 谢谢回复 解决方案四: 最短路径算法(java实现)

java 编程-JAVA实现距离矢量算法

问题描述 JAVA实现距离矢量算法 1.编程实现右图所示简单网络拓扑的距离向量路由算法. 1.1 结点之间的连接关系固定: 1.2 链路开销可以由用户设定. 2.距离向量算法的实现方式: 2.1 可以利用多线程机制:每个结点一个 线程:每隔一段事件利用线程间通信 机制传递距离向量(DV):或是 2.2 每个结点利用单独的进程实现:每隔一 段时间利用Socket实现结点间的距离向量交换: 2.3 距离向量的计算与结点路由表的显示. 3.网络拓扑结构的描述(数据结构),拓扑结构利用文件存储. 4.结

java-求Pareto蚁群算法的源码 Java的

问题描述 求Pareto蚁群算法的源码 Java的 求Pareto最优化和蚁群算法相结合的算法的源码,即Pareto蚁群算法 Java的

[Java 泥水匠] Java Components 之二:算法篇之项目实践中的位运算符(有你不懂的哦)

2.1 前言   自从上篇[Java 泥水匠] Java Components 之一:Java String (肯定有你不懂的泥瓦匠很快又和你们聊起来了.写的还不错~ 要时刻对自己说: 得到殊荣也是昨天,看在眼里的只有今天.等待明天的只有死亡和坟墓. 回到正题,今天是讲位运算的,肯定有你不知道的.提纲: 2.2    异或基本算法 2.2.1  补充例子异或加密解密 2.3   '按位与'运算 就是那么简单 2.4    从非中,学习原码补码运算 2.5    综合算法现实案例 2.6    总

Redis和nosql简介,api调用;Redis数据功能(String类型的数据处理);List数据结构(及Java调用处理);Hash数据结构;Set数据结构功能;sortedSet(有序集合)数

1.Redis和nosql简介,api调用 14.1/ nosql介绍   NoSQL:一类新出现的数据库(not only sql),它的特点: 1.  不支持SQL语法 2.  存储结构跟传统关系型数据库中的那种关系表完全不同,nosql中存储的数据都是KV形式 3.  NoSQL的世界中没有一种通用的语言,每种nosql数据库都有自己的api和语法,以及擅长的业务场景 4.  NoSQL中的产品种类相当多: a)        Mongodb  文档型nosql数据库,擅长做CMS系统(内

算法难题设计出java代码或者伪代码,大牛请进。

问题描述 算法难题设计出java代码或者伪代码,大牛请进. 把 1 2 3 4 5 6 7 8 9 放入三个数组里面 数组可以是空的.. 数组里面的数 是有序的 比如 {1 2 3} { 4 5 6 } { 7 8 9 }:{356789},{124},{}能穷举吗.打印出来 解决方案 {123456789},{},{} 可以么,如果是可以的话,那么是非常简单的 解决方案二: 我是一个刚刚学习编程半年的小白,有点思路,可能不准确,抛砖引玉.我觉得这个题的实质,是对1 2 3 4 5 6 7 8

Java、Java Applet与 &amp;#106avascript间的通信

摘 要:本文着重阐述了网页开发中,通过灵活使用从JavaScript语言中访问Java的方法.从JavaScript中访问JavaScript小程序的方法与变量,以及在Java Applet小程序中使用JavaScript等技术,实现这几种网页开发语言的互相补充,以开发更完美的Web应用程序. JavaScript是用于HTML环境的开发语言,提供了能够响应Web页面事件的脚本,可以完全访问浏览器窗口的各个方面,善于合并HTML.Java Applet小程序.插入件.服务器方程序和其他Web组件

用 Java 生成 Java:CodeModel 介绍

在我们编写代码的时候,常常会有这样的情形:一部分代码是可以根据另一部分代码按照某种特定的模式变化而来的: 有时,随着那一部分被依赖的代码发生变化,依赖的代码不得不跟着修改:有时,这样的代码会随着项目的推进,不止一次 的出现.很典型的一个例子就是,当需要自己实现数据访问层时,通常每个实体类会对应一个 DAO(数据访问对象)类,并 且一般来讲 DAO 类的代码编写是很机械的.这时,我们就需要使用"代码生成"来提高我们的开发效率以及提高代码的可 维护性. Java 有很多种方法可以实现&qu

java继承-JAVA抽象类(新手求解)

问题描述 JAVA抽象类(新手求解) 子类继承了一个抽象类,抽象类中没有无参构造函数,有有参构造.请问子类能实例化么?如果能,怎么做? 解决方案 子类构造方法中使用super()传参,指定一个父类的构造器 假如父类构造器是private修饰的那就没办法继承了. 解决方案二: 能,可以直接使用无参,也可以使用父类的有参构造 解决方案三: 首先,你应该先了解继承的原理,继承的强大在于子类可以继承来自父类的一切可继承的特征和行为,更重要的是子类不仅仅可以继承来自父类的特征和行为,而且还具备自我扩展的能

java web java.lang.NullPointerException

问题描述 java web java.lang.NullPointerException 严重: Servlet.service() for servlet [selectServlet] in context with path [/Exercise] threw exceptionjava.lang.NullPointerException at DB.DataBaseConnection.selectOperation1(DataBaseConnection.java:45) at Ser