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背包问题是一种经典的计算机科学优化问题,常用于求解有限资源下的最佳分配策略。它在实际生活中的应用广泛,比如商品装箱、任务调度、投资组合优化等场景。在这个问题中,我们有一系列物品,每个物品都有一个价值...
01背包问题是一种经典的组合优化问题,它来源于实际生活中的资源分配和调度问题。在这个问题中,我们有一组物品,每种物品都有自己的重量和价值,目标是选取一部分物品装入一个容量有限的背包中,使得装入背包的物品...
本文将详细解析三种常见的背包问题:01背包、完全背包和多重背包。 首先,我们来了解01背包问题。01背包问题的名字来源于每个物品只能选择放入背包(1)或不放入(0)。问题定义如下:给定n个物品,每个物品有自己...
01背包问题是一种经典的组合优化问题,常在计算机科学中被用作教学示例和算法设计练习。在01背包问题中,我们有一组物品,每个物品都有一个重量和一个价值,目标是选择一部分物品放入容量有限的背包中,使得装入背包...
01背包问题是一种经典的组合优化问题,常出现在计算机科学、运筹学以及算法设计与分析中。它描述了这样一个场景:我们有一组物品,每件物品都有一定的重量和价值,现在有一个容量有限的背包,我们需要决定选取哪些...
01背包问题是一种在计算机科学和运筹学中常见的优化问题,主要涉及到组合优化和动态规划。在这个问题中,我们有n个物品,每个物品都有一个重量w[i]和一个价值v[i],以及一个容量为W的背包。目标是选择物品放入背包,...
"01背包问题(动态规划法)" 本文将详细介绍动态规划法解决01背包问题的算法设计思想、算法改进思想、存储结构、算法实现等内容。动态规划是一种非常重要的算法方法,广泛应用于经济管理、生产调度、工程技术和最优...
01背包问题是一种经典的组合优化问题,经常在计算机科学,特别是在算法设计和分析中出现。这个问题的基本设定是:你有一组物品,每种物品都有一个重量和一个价值,以及一个固定容量的背包。目标是在不超过背包容量的...
标题中的"动态规划_01背包_01背包_C++_算法_背包_动态规划_"揭示了我们讨论的主题是使用C++编程语言实现的01背包问题的动态规划算法。01背包问题指的是每个物品只能被选择或不被选择(即0或1),不能被分割,目标是...
利用动态规划解决01背包问题 动态规划是一种非常重要的算法方法,它可以用来解决许多复杂的问题,例如经济管理、生产调度、工程技术和最优控制等方面的问题。01背包问题是动态规划的经典模型之一,它可以用于解决...
在解决01背包问题时,分支限界法是一种非常有效的方法。01背包问题是一个经典的组合优化问题,目标是确定如何在容量有限的背包中放入物品以最大化总价值,其中每种物品都有一个重量和一个价值,且物品只能被完全取走...
贪婪法解决01背包问题贪婪法解决01背包问题贪婪法解决01背包问题贪婪法解决01背包问题
在计算机科学中,优化问题经常需要求解一个有限的解空间,01背包问题就是这类问题的一个典型例子。01背包问题涉及到在一个有限的容量限制下,如何选择物品以最大化价值。这个问题可以通过多种方法解决,其中回溯法是...
01背包问题是一种经典的组合优化问题,广泛应用于资源分配、任务调度等领域。在这个问题中,我们有一个容量为W的背包,以及n件物品,每件物品都有一个重量w[i]和一个价值v[i]。目标是选取不超过背包容量的物品,使得...
01背包问题及变种详解 01背包问题是经典的背包问题九讲文档中的一种,包含了01背包及其变种的详细解释。它的基本思路是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即f[i][v]表示前i件物品恰放入一个...
01背包问题是一种经典的组合优化问题,经常出现在计算机科学、运筹学以及算法设计与分析中。在这个问题中,我们有n个物品,每个物品都有一个重量w[i]和一个价值v[i],以及一个容量为W的背包。目标是选择物品的子集,...
01背包问题是一种经典的组合优化问题,常在计算机科学、运筹学以及算法设计与分析中出现。在这个问题中,我们有一组物品,每种物品都有一个重量和一个价值,我们的目标是在不超过背包总容量的前提下,选取物品以最大...
在给定文件中,我们可以提取到关于01背包问题的知识点。01背包问题是一个经典的动态规划问题,在计算机科学和运筹学中有广泛应用,尤其在算法竞赛如NOIP(全国青少年信息学奥林匹克竞赛)和少儿编程中十分常见。问题...
01背包问题是一种经典的计算机科学优化问题,常见于算法设计和分析中,特别是在组合优化和图论领域。这个问题源于现实世界中的资源分配问题,比如在有限的背包容量下选择价值最大的物品。01背包问题得名于每个物品...