首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

递归实现背包有关问题-Java

2012-09-07 
递归实现背包问题-JavaJava递归实现背包问题:问题描述:? ? ? ? ?有N件物品和一个容量为V的背包。第i件物品

递归实现背包问题-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

有空研究。。。

热点排行