動態規劃之揹包問題

題目描述就不用說了,這裏直接給上數據:

		揹包的容量 : 20
		物品的質量:2   3   4   5   9
		物品的價錢:3   4   5   8   10

其實這種問題,簡單了就是每走一步都會有選和不選的兩種情況,而這兩種情況,必須要選擇其中最好的情況:

使用B(K,W): k 個商品 ; W 剩下的空間,來表示當前的狀態。
在這裏插入圖片描述
可以將選擇樹和狀態方程相對應:
在這裏插入圖片描述
對於最終的數組都出出現以下情況:
在這裏插入圖片描述
所以對於揹包問題有如下代碼:

package com.lanqiao.study;

/**
 * 算法描述
 * 揹包重量:2   3   4   5   9
 * 價值:   3   4   5   8   10
 * 揹包容量: 20
 * B(K,W): k 個商品 ; W 剩下的空間
 */
public class 揹包問題 {
    public static void main(String[] args) {
        //對於每一種的商品都有偷和不偷的兩種情況
        //偷 : 揹包的重量會減少相應的重量,不偷,會將物品減一,商品的數量會減少
        //數組的行代表的是K個商品,列代表的是
        int[][] dp = new int[6][21];
        int[] p = {0, 3, 4, 5, 10, 8};
        int[] v = {0, 2, 3, 4, 9, 5};
        for (int i = 1; i < 6; i++) {
            for (int j = 1; j < 21; j++) {
                //中止條件時,當前的重量大於揹包的容量,就只是減去數量,但是不加質量
                if (v[i] > j) {
                    dp[i][j] = dp[i - 1][j];
                } else {
                    //選
                    int a = dp[i - 1][j - v[i]] + p[i];
                    //不選
                    int b = dp[i - 1][j];
                    dp[i][j] = Math.max(a, b);
                }
            }

        }
        System.out.println(dp[5][20]);
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章