Java递归实现背包问题:
问题描述:
有N件物品和一个容量为V的背包。第i件物品的费用是c,价值是w。求解将哪些物品装入背包可 使这些物品的费用总和不超过背包容量,且价值总和最大。
基本思路:
这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。 用子问题定义状态:即f[v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则 其状态转移方程便是:f[v]=max{f[v],f[v-c]+w}。
实现代码:
/**
* @author Sun Kui
*/
public class Knapsack {
public static void main(final String... args) {
int[] arr = new int[5];
arr[0] = 11;
arr[1] = 8;
arr[2] = 7;
arr[3] = 5;
arr[4] = 3;
Knapsack k = new Knapsack();
System.out.println(k.knapsack(arr, 0, 20, 20));
}
/**
*@param arr all of items in knapsack
*@param start the start item to be put into the knapsack
*@param left the remaining capacity of knapsack
*@param sum capacity of knapsack
*/
public boolean knapsack(int[] arr, int start, int left, int sum) {
if (arr.length == 0) {
return false;
}
// start from the next item in original array
if (start == arr.length) {
int[] tempArr = new int[arr.length - 1];
for (int i = 0; i < tempArr.length; i++) {
tempArr[i] = arr[i + 1];
}
return knapsack(tempArr, 0, sum, sum);
} else if (arr[start] > left) {
return knapsack(arr, start + 1, left, sum);
} else if (arr[start] == left) {
for (int i = 0; i < start + 1; i++) {
// print the answer out
System.out.print(arr[i] + "\t");
}
System.out.println();
return true;
} else {
return knapsack(arr, start + 1, left - arr[start], sum);
}
}
}
end.
另外一种动态规划解法请见:
http://www.360doc.com/content/07/0518/21/20151_507835.shtml
有空研究。。。
分享到:
相关推荐
Java语言中实现0-1背包的递归解法通常会使用一个二维数组dp,其中dp[i][j]表示在前i个物品中,容量为j时的最大价值。递归函数可以如下表示: ```java int knapsack(int W, int[] w, int[] v, int n) { int[][] dp ...
装载问题-分支限界算法-java实现 装载问题 装载问题是一种经典的组合优化问题,目的是在有限的容量内装载尽可能多的物品,以达到最大化总重量或总价值。装载问题有多种变种,包括0/1背包问题、分支限界问题、动态...
实验报告涉及两个经典算法问题,分别是背包问题...总结一下,本实验涵盖了递归算法在解决实际问题中的应用,如背包问题和自然数拆分问题,通过递归函数的设计和实现,不仅训练了编程技能,还提升了问题解决和分析能力。
本JAVA程序通过回溯法实现了01背包问题的求解,清晰地展示了如何利用递归和条件判断来遍历所有可能的物品组合,以达到在限定条件下价值最大化的目标。此方法不仅适用于01背包问题,对于其他需要探索所有可能性的组合...
这本书“数据结构与算法经典问题解析-Java语言描述”旨在帮助读者深入理解这些概念,并通过具体的Java代码实现来提升解决实际问题的能力。 1. **数据结构**: - **数组**:是最基本的数据结构,它是一系列相同类型...
### 回溯法解决01背包问题 #### 一、问题背景及定义 在计算机科学领域,01背包问题是一个经典的组合优化问题。该问题的基本形式是:给定一组物品,每种物品都有对应的重量和价值,以及一个背包,背包有一定的承重...
在提供的资源中,"KnapSack2.java"是Java源代码文件,它实现了回溯算法解决0-1背包问题。源代码可能包含了以下关键部分: 1. 定义物品类:每个物品都有其重量和价值,这些信息用于计算解的可行性。 2. 回溯函数:这...
标题中的“背包问题算法Java实现”指的是在计算机科学中,运用动态规划解决0-1背包问题的算法,并用Java编程语言进行实现。背包问题是一种优化问题,通常涉及到在一个容量有限的背包中选择物品,目标是使得背包中...
Java界面实现的01背包问题旨在为用户提供一个友好的图形用户界面(GUI),以便输入物品信息并可视化地展示最优解。用户可以输入物品的数量和每个物品的重量、价值,系统会根据这些信息计算出最优的选择方案。 以下...
本资源"深入研究算法的Java实现和技术面试常见问题示例"提供了对算法的深入理解和在实际面试中的应用,特别关注了Java和Python这两种流行的编程语言。这份压缩包可能包含了各种类型的算法实现,如排序、搜索、图论、...
为了实现上述算法,我们需要定义一个`Knapsack`类来表示背包问题,以及相关的函数和数据成员: ```cpp template class Knapsack { public: Knapsack(int mSize, T cap, T wei[], T prof[]); T BKnapsack(int x[])...
0-1背包问题是一个经典的计算机科学中的组合优化问题,它在...在压缩包文件"算法分析-0-1背包-王威-09308014-软件081"中,可能包含了对这个问题更深入的分析、优化策略或者具体的Java代码实现,值得进一步学习和研究。
在给定的压缩包文件中,应该包含了实现这个0-1背包问题蛮力法的C#代码。通过分析和运行这个代码,你可以更深入地理解这个问题的解决思路和C#编程实现细节。同时,这也是一个很好的学习机会,可以帮助你提升在组合...
《2018JAVA经典教程:数据结构与算法经典问题解析》是一本深入探讨Java语言中数据结构和算法实现的教程。这本书旨在帮助读者理解并掌握如何使用Java有效地设计和解决各种计算问题。数据结构是计算机科学的基础,而算...
掌握这些算法及其Java实现,对于提升编程能力,解决实际问题,以及准备面试和竞赛都非常有帮助。通过阅读和实践这些源码,你可以加深对算法原理的理解,提高代码质量,并能够灵活运用到各种软件开发项目中。
里面含可运行的递归回溯旅行售货员问题java 版源码
6. **递归与回溯**:递归是函数自身调用的一种方式,常用于解决如阶乘计算、汉诺塔等问题。回溯则是一种尝试所有可能解决方案并逐步撤销无效尝试的方法,常见于解决八皇后问题、迷宫问题等。 7. **字符串处理**:...
### 0-1背包问题详解 #### 一、问题定义及数学模型 0-1背包问题是一种经典的组合优化问题,在实际应用中非常广泛。问题的基本形式如下:假设我们有一个背包,其最大承载能力为\( C \)(容量限制),同时有\( n \)...
4. **动态规划**:这是一类解决问题的有效方法,如背包问题、最长公共子序列等,通过构建状态转移方程,找到最优解。 5. **图算法**:如深度优先搜索(DFS)和广度优先搜索(BFS),在实际问题中,如路由、社交网络...
这份名为"algorithm-of-java-.doc.rar_doc"的压缩文件显然包含了30个经典的Java算法实例,其中每个实例都可能涵盖排序、搜索、图论、动态规划等多个领域的知识。文档格式为.doc,通常用于存储文字信息,包括代码、...