`
bnmnba
  • 浏览: 293597 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

01背包问题

 
阅读更多

动态规划:http://zh.wikipedia.org/zh-cn/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92#.E8.83.8C.E5.8C.85.E9.97.AE.E9.A2.98

直接看解法吧,貌似还是有问题。

 

 

package package01;

public class TestPackage01 {
	static OBJ[] objs={new OBJ(3,4),new OBJ(8,17),new OBJ(5,9),new OBJ(6,8),new OBJ(10,16)};//物品
	
	static int II=20;static int VV=20;static int[][] IVmap=new int[II][VV];//第I个物品放入体积为V的背包时的最大价值
	static int num=0;//计算的次数
	public static void main(String[] args) {
		for(int i=0;i<II;i++){//初始化为-1
			for(int j=0;j<VV;j++){
				IVmap[i][j]=-1;
			}
		}
		System.out.println(maxValue(4,11));//对objs中的这些背包来说,第五次放入物品的最大价值,就是最优解
		System.out.println(num);
		for(int i=0;i<II;i++){
			for(int j=0;j<VV;j++){
				System.out.print(" "+IVmap[i][j]);
			}
			System.out.println();
		}
	}
	/**
	 * 放第i件物品到体积为v的包里的最大价值
	 * @param i 从物品里取出一个物品放入包中,这个是第i次取出的物品。大于等于0
	 * 如果i是0,也就是第一次取物品时,取一个物品,放到体积为v的包里,最大价值是多少。
	 * @param v 一个体积为v的包,大于等于0
	 * @return 最大价值,应该是个大于等于0的数
	 */
	public static int maxValue(int i,int v){
		if (IVmap[i][v]>-1) {//看是否已经计算过//初始化为-1
			return IVmap[i][v];
		}
		num++;
		int val=0;
		if (i<1) {//第一次取物品时
			for (int j = 0; j < objs.length; j++) {
				if (objs[j].v<v) {
					val=max(val,objs[j].p);
				}
			}
		}else {
			for(int j=0;j < objs.length; j++) {//遍历所有的物品,找到i
				int VI=objs[j].v;//VI为第i个物品的体积
				int PI=objs[j].p;//PI为第i个物品的价值
				if (v<VI) {//当前物品无法放入背包
					val=maxValue(i-1,v);
				}else if(v>=VI){
					val= max(maxValue(i-1,v),maxValue(i-1,v-VI)+PI);//当前物品可以放入背包,也可以不放入
				}
				if(i==-1||v==0)val=0;//这是什么情况下会出现?
			}
		}
		IVmap[i][v]=val;//记录计算的结果
		return val;
	}
	private static int max(int val, int p) {
		return p>val?p:val;
	}
}
class OBJ{
	public int v;
	public int p;
	public OBJ(int v,int p){
		this.v=v;
		this.p=p;
	}
}

 运行结果:

 

17
31
 0 0 0 0 -1 4 9 -1 9 -1 -1 17 -1 -1 -1 -1 -1 -1 -1 -1
 0 0 0 0 -1 4 9 -1 9 -1 -1 17 -1 -1 -1 -1 -1 -1 -1 -1
 0 0 0 0 -1 4 9 -1 9 -1 -1 17 -1 -1 -1 -1 -1 -1 -1 -1
 -1 0 -1 0 -1 4 9 -1 9 -1 -1 17 -1 -1 -1 -1 -1 -1 -1 -1
 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 17 -1 -1 -1 -1 -1 -1 -1 -1
 

 

 

 

分享到:
评论

相关推荐

    01背包问题的C语言代码

    01背包问题是一种经典的计算机科学优化问题,常用于求解有限资源下的最佳分配策略。它在实际生活中的应用广泛,比如商品装箱、任务调度、投资组合优化等场景。在这个问题中,我们有一系列物品,每个物品都有一个价值...

    用回溯法解决01背包问题C语言实现

    01背包问题是一种在计算机科学和运筹学中常见的优化问题,主要涉及到组合优化和动态规划。在这个问题中,我们有n个物品,每个物品都有一个重量w[i]和一个价值v[i],以及一个容量为W的背包。目标是选择物品放入背包,...

    01背包问题(动态规划法).pdf

    "01背包问题(动态规划法)" 本文将详细介绍动态规划法解决01背包问题的算法设计思想、算法改进思想、存储结构、算法实现等内容。动态规划是一种非常重要的算法方法,广泛应用于经济管理、生产调度、工程技术和最优...

    分治法求01背包问题c语言

    01背包问题是一种经典的组合优化问题,常出现在计算机科学、运筹学以及算法设计与分析中。它描述了这样一个场景:我们有一组物品,每件物品都有一定的重量和价值,现在有一个容量有限的背包,我们需要决定选取哪些...

    回溯法和动态规划法解01背包问题

    01背包问题是一种经典的组合优化问题,经常在计算机科学,特别是在算法设计和分析中出现。这个问题的基本设定是:你有一组物品,每种物品都有一个重量和一个价值,以及一个固定容量的背包。目标是在不超过背包容量的...

    01背包问题_01背包问题_

    01背包问题是一种经典的组合优化问题,广泛应用于资源分配、任务调度等领域。在这个问题中,我们有一个容量为W的背包,以及n件物品,每件物品都有一个重量w[i]和一个价值v[i]。目标是选取不超过背包容量的物品,使得...

    利用动态规划解决01背包问题

    利用动态规划解决01背包问题 动态规划是一种非常重要的算法方法,它可以用来解决许多复杂的问题,例如经济管理、生产调度、工程技术和最优控制等方面的问题。01背包问题是动态规划的经典模型之一,它可以用于解决...

    Python基于回溯法解决01背包问题实例

    在计算机科学中,优化问题经常需要求解一个有限的解空间,01背包问题就是这类问题的一个典型例子。01背包问题涉及到在一个有限的容量限制下,如何选择物品以最大化价值。这个问题可以通过多种方法解决,其中回溯法是...

    01背包问题 回溯法

    01背包问题是一种经典的组合优化问题,常在计算机科学、运筹学以及算法设计与分析中出现。在这个问题中,我们有一组物品,每种物品都有一个重量和一个价值,我们的目标是在不超过背包总容量的前提下,选取物品以最大...

    贪婪法解决01背包问题

    贪婪法解决01背包问题贪婪法解决01背包问题贪婪法解决01背包问题贪婪法解决01背包问题

    01背包问题回溯法解决子集树

    01背包问题是一种经典的组合优化问题,经常出现在计算机科学、运筹学以及算法设计与分析中。在这个问题中,我们有n个物品,每个物品都有一个重量w[i]和一个价值v[i],以及一个容量为W的背包。目标是选择物品的子集,...

    01背包问题的贪心算法.pdf

    ### 01背包问题的贪心算法 #### 一、问题背景及定义 01背包问题是一种经典的组合优化问题,在计算机科学与运筹学领域有着广泛的应用。该问题描述如下:给定一组物品,每个物品都有一个重量\( w_i \)和一个价值\( v...

    分支限界算法 01背包问题

    在解决01背包问题时,分支限界法是一种非常有效的方法。01背包问题是一个经典的组合优化问题,目标是确定如何在容量有限的背包中放入物品以最大化总价值,其中每种物品都有一个重量和一个价值,且物品只能被完全取走...

    C++分支限界法(BFS求解01背包问题)

    本主题将深入探讨如何使用C++编程语言,结合分支限界法(通常与广度优先搜索BFS相结合)来解决01背包问题。 01背包问题是一个经典的组合优化问题,其核心是给定一组物品,每件物品有重量和价值,目标是在不超过背包...

    93、1267:【例9.11】01背包问题(2020.03.17)a.pdf

    在给定文件中,我们可以提取到关于01背包问题的知识点。01背包问题是一个经典的动态规划问题,在计算机科学和运筹学中有广泛应用,尤其在算法竞赛如NOIP(全国青少年信息学奥林匹克竞赛)和少儿编程中十分常见。问题...

    01背包问题穷举法

    其中,“01背包问题”是最基础的一种形式。 **01背包问题定义** 01背包问题得名于每个物品只能被完全放入或完全排除,即每种物品的数量是“0”或“1”,不能分割。具体来说,我们有一组物品,每种物品都有一个重量...

    C++编写的01背包问题

    01背包问题是一种经典的计算机科学优化问题,常用于学习和研究动态规划算法。在这个问题中,我们有一个容量有限的背包,以及一系列物品,每个物品都有一个重量和一个价值。目标是选择一部分物品装入背包,使得背包总...

    非01背包问题

    非01背包问题,也称为部分背包问题或有界背包问题,是背包问题的一个变种。在经典的01背包问题中,我们面对的是一个有限的背包,每种物品都有一个重量和价值,目标是在不超过背包容量的前提下,选择物品以最大化总...

Global site tag (gtag.js) - Google Analytics