`
sunwinner
  • 浏览: 203411 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

递归实现背包问题-Java

 
阅读更多

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

有空研究。。。

分享到:
评论

相关推荐

    0-1背包递归求解Java语言描述

    Java语言中实现0-1背包的递归解法通常会使用一个二维数组dp,其中dp[i][j]表示在前i个物品中,容量为j时的最大价值。递归函数可以如下表示: ```java int knapsack(int W, int[] w, int[] v, int n) { int[][] dp ...

    装载问题-分支限界算法-java实现

    装载问题-分支限界算法-java实现 装载问题 装载问题是一种经典的组合优化问题,目的是在有限的容量内装载尽可能多的物品,以达到最大化总重量或总价值。装载问题有多种变种,包括0/1背包问题、分支限界问题、动态...

    背包问题,自然数拆分问题(Java递归实现,含分析)

    实验报告涉及两个经典算法问题,分别是背包问题...总结一下,本实验涵盖了递归算法在解决实际问题中的应用,如背包问题和自然数拆分问题,通过递归函数的设计和实现,不仅训练了编程技能,还提升了问题解决和分析能力。

    回溯法实现01背包问题JAVA版.txt

    本JAVA程序通过回溯法实现了01背包问题的求解,清晰地展示了如何利用递归和条件判断来遍历所有可能的物品组合,以达到在限定条件下价值最大化的目标。此方法不仅适用于01背包问题,对于其他需要探索所有可能性的组合...

    数据结构与算法经典问题解析-Java语言描述

    这本书“数据结构与算法经典问题解析-Java语言描述”旨在帮助读者深入理解这些概念,并通过具体的Java代码实现来提升解决实际问题的能力。 1. **数据结构**: - **数组**:是最基本的数据结构,它是一系列相同类型...

    回溯法-01背包问题 java

    ### 回溯法解决01背包问题 #### 一、问题背景及定义 在计算机科学领域,01背包问题是一个经典的组合优化问题。该问题的基本形式是:给定一组物品,每种物品都有对应的重量和价值,以及一个背包,背包有一定的承重...

    java算法 0-1 背包问题回溯算法解决 netbeans

    在提供的资源中,"KnapSack2.java"是Java源代码文件,它实现了回溯算法解决0-1背包问题。源代码可能包含了以下关键部分: 1. 定义物品类:每个物品都有其重量和价值,这些信息用于计算解的可行性。 2. 回溯函数:这...

    背包问题算法Java实现

    标题中的“背包问题算法Java实现”指的是在计算机科学中,运用动态规划解决0-1背包问题的算法,并用Java编程语言进行实现。背包问题是一种优化问题,通常涉及到在一个容量有限的背包中选择物品,目标是使得背包中...

    java 界面实现的01背包问题

    Java界面实现的01背包问题旨在为用户提供一个友好的图形用户界面(GUI),以便输入物品信息并可视化地展示最优解。用户可以输入物品的数量和每个物品的重量、价值,系统会根据这些信息计算出最优的选择方案。 以下...

    深入研究算法的Java实现和技术面试常见问题示例 - Java, Python - 下载.zip

    本资源"深入研究算法的Java实现和技术面试常见问题示例"提供了对算法的深入理解和在实际面试中的应用,特别关注了Java和Python这两种流行的编程语言。这份压缩包可能包含了各种类型的算法实现,如排序、搜索、图论、...

    用回溯算法解决0/1背包问题

    为了实现上述算法,我们需要定义一个`Knapsack`类来表示背包问题,以及相关的函数和数据成员: ```cpp template class Knapsack { public: Knapsack(int mSize, T cap, T wei[], T prof[]); T BKnapsack(int x[])...

    0-1背包 Java 回溯法

    0-1背包问题是一个经典的计算机科学中的组合优化问题,它在...在压缩包文件"算法分析-0-1背包-王威-09308014-软件081"中,可能包含了对这个问题更深入的分析、优化策略或者具体的Java代码实现,值得进一步学习和研究。

    蛮力法解决0-1背包问题

    在给定的压缩包文件中,应该包含了实现这个0-1背包问题蛮力法的C#代码。通过分析和运行这个代码,你可以更深入地理解这个问题的解决思路和C#编程实现细节。同时,这也是一个很好的学习机会,可以帮助你提升在组合...

    2018JAVA经典教程:数据结构与算法经典问题解析-Java语言描述

    《2018JAVA经典教程:数据结构与算法经典问题解析》是一本深入探讨Java语言中数据结构和算法实现的教程。这本书旨在帮助读者理解并掌握如何使用Java有效地设计和解决各种计算问题。数据结构是计算机科学的基础,而算...

    基于Java的源码-JAVA近百种算法大全打包.zip

    掌握这些算法及其Java实现,对于提升编程能力,解决实际问题,以及准备面试和竞赛都非常有帮助。通过阅读和实践这些源码,你可以加深对算法原理的理解,提高代码质量,并能够灵活运用到各种软件开发项目中。

    递归回溯旅行售货员问题(java 版源码)

    里面含可运行的递归回溯旅行售货员问题java 版源码

    elicpse-Java各种算法代码

    6. **递归与回溯**:递归是函数自身调用的一种方式,常用于解决如阶乘计算、汉诺塔等问题。回溯则是一种尝试所有可能解决方案并逐步撤销无效尝试的方法,常见于解决八皇后问题、迷宫问题等。 7. **字符串处理**:...

    0-1背包问题

    ### 0-1背包问题详解 #### 一、问题定义及数学模型 0-1背包问题是一种经典的组合优化问题,在实际应用中非常广泛。问题的基本形式如下:假设我们有一个背包,其最大承载能力为\( C \)(容量限制),同时有\( n \)...

    40-examples-of-java.rar_40

    4. **动态规划**:这是一类解决问题的有效方法,如背包问题、最长公共子序列等,通过构建状态转移方程,找到最优解。 5. **图算法**:如深度优先搜索(DFS)和广度优先搜索(BFS),在实际问题中,如路由、社交网络...

    algorithm-of-java-.doc.rar_doc

    这份名为"algorithm-of-java-.doc.rar_doc"的压缩文件显然包含了30个经典的Java算法实例,其中每个实例都可能涵盖排序、搜索、图论、动态规划等多个领域的知识。文档格式为.doc,通常用于存储文字信息,包括代码、...

Global site tag (gtag.js) - Google Analytics