01揹包問題

糾結了很久的01揹包問題,現在的感覺主要能寫出來狀態方程應該就好寫了。
設i爲當前放入物體的數量,j爲放入的物體的總重量,則函數f[i][j]爲總價值。
則函數f[i][j]的狀態方程爲
當放入第i個物體超重的時候 即weight[i-1]>j,f[i][j] =f[i-1][j];
反之f[i][j] = max{f[i-1][j] , f[i-1][j-weight[i]]+val[i]};

    public static void main(String[] args) {
        //揹包問題主要是指一個給定容量的揹包、若干具有一定價值和重量的物品,如何選擇物品放入揹包使物品的價值最大,01揹包,即每個物品最多放一個
        int[] weight = {3,5,2,6,4}; //物品重量
        int[] val = {4,4,3,5,3}; //物品價值
        int m = 12; //揹包容量
        int n = val.length; //物品個數

        int[][] f = new int[n+1][m+1];
        for (int i=0;i<f.length;i++){
            f[i][0] = 0;
        }
        for (int i=0;i<f[0].length;i++){
            f[0][i] = 0;
        }
        for (int i=1;i<f.length;i++){
            for (int j = 1;j<f[0].length;j++){
                if (weight[i-1]>j){//當放入第i個物體超重的時候
                    f[i][j] = f[i-1][j];
                }
                else {
                    if (f[i-1][j]<f[i-1][j-weight[i-1]]+val[i-1]){//放入第i個物體不超重並且價值更大
                        f[i][j] = f[i-1][j-weight[i-1]]+val[i-1];
                    }
                    else {
                        f[i][j] =f[i-1][j];
                    }
                }
            }
        }

        System.out.println(f[n][m]);

    }

參考博客:http://blog.csdn.net/ls5718/article/details/52227908

發佈了43 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章