1. 程式人生 > >【動態規劃】0-1背包問題原理和實現

【動態規劃】0-1背包問題原理和實現

最大 一個 get ++ string span ati 0-1背包問題 div

  • 0 1背包——每種物品只能選0件或者1件
    /**
     * weight[] = {2,3,4,5}
     * value[]  = {3,4,5,7}
     * 求解滿足小於背包最大承重得到最大價值的物品存放策略
     * 思路核心:
     *      1. 當前取物品的重量weight[i-1] <= j 當前能取最大重量
     *      2. 比較價值:不放這個物品的最高價值 和 放入此物品的最高價值
     *          maxValue[i-1][j]  不放這個物品的最高價值
     *          value[i-1] + maxValue[i-1][j-weight[i-1]]  當前物品價值 + 放入當前物品的前i-1個物品的最高價值
     *       -------------------------------------------------------
     *      | i\j | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9  |
     *       -------------------------------------------------------
     *      |  0  | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0  |
     *       -------------------------------------------------------
     *      |  1  | 0 | 0 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3  |
     *       -------------------------------------------------------
     *      |  2  | 0 | 0 | 3 | 4 | 4 | 7 | 7 | 7 | 7 | 7  |
     *       -------------------------------------------------------
     *      |  3  | 0 | 0 | 3 | 4 | 5 | 7 | 8 | 9 | 9 | 12 |
     *       -------------------------------------------------------
     *      |  4  | 0 | 0 | 3 | 4 | 5 | 7 | 8 | 10| 11| 12 |
     *       -------------------------------------------------------
     * eg:
     *      i=3,j=2;
     *      weight[3-1] = 4 > j -----> maxValue[3-1][2] = maxValue[2-1][2] = 3
     *
     *      i=3,j=4;
     *      weight[3-1] = 4 <= j 成立
     *      maxValue[3-1][4] = 4 不放這個物品的最高價值
     *      value[3-1] + maxValue[2][4-4] =5 + 0 = 5 > 4   當前物品價值 + 放入當前物品的前i-1個物品的最高價值
     
*/ public static int getMaxValue(int[] weight, int[] value, int maxWeight) { int n = weight.length;//物品數目 // 定義最大價值二維數組,從0開始,各維度需加一個長度 int[][] maxValue = new int[n + 1][maxWeight + 1]; // 最大重量和物品數為0,價值為0 for (int w = 0; w < maxWeight + 1; w++) { maxValue[
0][w] = 0; } for (int i = 0; i < n + 1; i++) { maxValue[i][0] = 0; } // 只拿前i件物品(最大價值從0開始,對應的weight和value取i-1) for (int i = 1; i <= n; i++) { for (int j = 1; j <= maxWeight; j++) { // 先假定當前物品的最大價值等於放上一件的最大價值 maxValue[i][j] = maxValue[i - 1][j];
// 當前物品的重量小於等於總重量 if (weight[i - 1] <=j) { // 比較 不放這個物品的最高價值 和 放入此物品的最高價值 if (value[i - 1] + maxValue[i - 1][j - weight[i - 1]] > maxValue[i - 1][j]) { maxValue[i][j] = value[i - 1] + maxValue[i - 1][j - weight[i - 1]]; } } } } return maxValue[n][maxWeight]; } public static void main(String[] args){ int weight[]={2,3,4,5}; int value[]={3,4,5,7}; int maxWeight=9; System.out.println(getMaxValue(weight,value,maxWeight)); }

【動態規劃】0-1背包問題原理和實現