`
hxr521521
  • 浏览: 10475 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

01背包

 
阅读更多
01背包的 动态规划和 穷举法
首先是动态规划
public static void main(String[] args) {
		List<Product> products = new ArrayList<Product>();
		products.add(new Product(10, 3));
		products.add(new Product(3, 4));
		products.add(new Product(4, 5));
		products.add(new Product(5, 6));
		dynamicPack01(products, 14);
	}

	/**
	 * 状态转移方程 c[i][m] = max{c[i - 1][m], c[i - 1, m-w[i]] + p[i]}
	 * 其中i 是第i个物品,m是重量, w[i] 指 第i个 物品的重量,p[i]指的是第i个物品的价格
	 * w只能是整数,如果是小数 乘以一个10^x, 由于O(maxWeight * products) 
	 * 可以看到动态规划的复杂度是随之重量的提高而提高,小数的话会生成10^x的数量级- -
	 * @param products
	 * @param maxWeight
	 */
	public static void dynamicPack01(List<Product> products, int maxWeight){
		//这里多开辟了一列空间方便计算,在多开辟一行方便计算,来处理第1列物品的最大值
		long time = System.nanoTime();
		int[][] table = new int[products.size() + 1][maxWeight + 1];
		long time3 = System.nanoTime();
		
		for(int m = 1; m < maxWeight + 1; m++){
			for(int i = 0; i < products.size(); i++){
				Product p = products.get(i);
				if(p.weight > m){//说明背包放不下此物品
					table[i + 1][m] = table[i][m];	
				}else{
					int max1 = table[i][m];
					int max2 = table[i][m - p.weight] + p.price;
					table[i + 1][m] = max1 > max2 ? max1 : max2;
				}
			}
		}
		
		long time2 = System.nanoTime() - time;
		long ktable = time3 - time;
		System.out.println("动态规划的耗时为" + time2);
		System.out.println("开辟表耗时为" + ktable);
		System.out.println("动态规划的耗时去表为" + (time2 - ktable));
		
		for(int j = 0; j < table[0].length; j++){
			System.out.print(j  + "\t");
		}
		System.out.println();
		for(int i = 0; i < table.length; i++){
			for(int j = 0; j < table[i].length; j++){
				System.out.print(table[i][j] + "\t");
			}
			System.out.println();
		}
		
	}


其次是穷举法
/**
	 * 穷举法
	 * @param products
	 * @return
	 */
	public static void getPack01Max(List<Product> products, int maxWeight){
		long time = System.nanoTime();
		List<Product> result = null;
		int priceMax = 0;
		
		for(int i = 0; i < products.size(); i++){
			int j = i;
			int tempWeight = 0;
			
			for(; j < products.size(); j++){
				tempWeight = tempWeight + products.get(j).weight;
				if(tempWeight > maxWeight){
					break;
				}
			}
			List<Product> temp = new ArrayList<Product>();
			int tempPrice = 0;
			for(int k = i; k < j; k++){
				tempPrice = tempPrice + products.get(k).price;
				temp.add(products.get(k));
			}
			if(tempPrice > priceMax){
				priceMax = tempPrice;
				result = temp;
			}
		}
		long time2 = System.nanoTime() - time;
		System.out.println("穷举法的耗时为" + time2);
		
		System.out.println("最大价值为 " + priceMax);
		for(Product p : result){
			System.out.println("weight : " + p.weight + "  price :" + p.price);
		}
	}
	


- - 由于动态规划的时间复杂度是O(Products * maxWeight) 而穷举法的时间复杂度是O(Products^2), 而且 动态规划开辟了一个二维数组,样本很少,且maxWeight比较大的时,穷举法的效率高于动态规划- -
分享到:
评论

相关推荐

    01背包问题的C语言代码

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

    回溯法01背包

    01背包问题是一种经典的组合优化问题,它来源于实际生活中的资源分配和调度问题。在这个问题中,我们有一组物品,每种物品都有自己的重量和价值,目标是选取一部分物品装入一个容量有限的背包中,使得装入背包的物品...

    背包之01背包、完全背包、多重背包详解.

    本文将详细解析三种常见的背包问题:01背包、完全背包和多重背包。 首先,我们来了解01背包问题。01背包问题的名字来源于每个物品只能选择放入背包(1)或不放入(0)。问题定义如下:给定n个物品,每个物品有自己...

    分支限界法求01背包c语言

    01背包问题是一种经典的组合优化问题,常在计算机科学中被用作教学示例和算法设计练习。在01背包问题中,我们有一组物品,每个物品都有一个重量和一个价值,目标是选择一部分物品放入容量有限的背包中,使得装入背包...

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

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

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

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

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

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

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

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

    动态规划_01背包_01背包_C++_算法_背包_动态规划_

    标题中的"动态规划_01背包_01背包_C++_算法_背包_动态规划_"揭示了我们讨论的主题是使用C++编程语言实现的01背包问题的动态规划算法。01背包问题指的是每个物品只能被选择或不被选择(即0或1),不能被分割,目标是...

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

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

    分支限界算法 01背包问题

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

    贪婪法解决01背包问题

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

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

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

    01背包问题_01背包问题_

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

    01背包问题及变种详解

    01背包问题及变种详解 01背包问题是经典的背包问题九讲文档中的一种,包含了01背包及其变种的详细解释。它的基本思路是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即f[i][v]表示前i件物品恰放入一个...

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

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

    01背包问题 回溯法

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

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

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

    01背包问题(省空间的)

    01背包问题是一种经典的计算机科学优化问题,常见于算法设计和分析中,特别是在组合优化和图论领域。这个问题源于现实世界中的资源分配问题,比如在有限的背包容量下选择价值最大的物品。01背包问题得名于每个物品...

Global site tag (gtag.js) - Google Analytics