1. 程式人生 > >0-1 背包問題

0-1 背包問題

存儲 容量 val pub logs max res [] 背包問題

給定一個容量為c的背包,以及一組物品,每個物品的重量及價值分別存放在一個數組中:weights[0...n],values[0...n]

求得將物品放入背包後的最大價值是多少?

Code:自底向上

    /**
     * 
     * @param weights 每個物品的重量
     * @param values 每個物品的價值
     * @param c 背包容量
     * @return
     */
    public int bestValue(int[] weights, int[] values, int c){
        int m = weights.length;
        
        
int[][] dp = new int[m][c+1]; for (int i = 0; i <= c; i++) { dp[0][i] = (i >= weights[0] ? values[0]:0); } for (int i = 1; i < m; i++) { for (int j = 0; j <= c; j++) { dp[i][j] = dp[i-1][j]; if(j >= weights[i]){ dp[i][j]
= Math.max(dp[i][j], dp[i-1][j-weights[i]]+values[i]); } } } return dp[m-1][c]; }

Code:自頂向下

    /**
     * 
     * @param dp 存儲記憶化空間
     * @param weights 每個物品的重量
     * @param values 每個物品的價值
     * @param index 放入物品的編號
     * @param c 背包容量
     * @return
*/ private int bagValue(int[][] dp, int[] weights, int[] values, int index, int c){ if (index < 0 || c <= 0) { return 0; } if(dp[index][c] != Integer.MIN_VALUE){ return dp[index][c]; } int res = bagValue(dp, weights, values, index-1, c); if (c >= weights[index]) { res = Math.max(res, bagValue(dp, weights, values, index-1, c-weights[index]) + values[index]); } dp[index][c] = res; return res; } public int bestValue1(int[] weights, int[] values, int c){ int n = weights.length; int[][] dp = new int[n][c+1]; for (int i = 0; i < n; i++) { for (int j = 0; j < c+1; j++) { dp[i][j] = Integer.MIN_VALUE; } } return bagValue(dp, weights, values, n-1, c); }

0-1 背包問題