天天看點

動态規劃求解背包問題(JAVA實作)

package com.knapsack.problem;

public class BackPack {
    //主函數
    public static void main(String[] args) {
        int m = ;//背包最大容量為10
        int n = ;//商品個數為3
        int w[] = {, , };//商品的重量 
        int p[] = {, , };//商品的價值
        int c[][] = BackPack_Solution(m, n, w, p);//儲存運算過程的數組
        for (int i = ; i <=n; i++) {
            for (int j = ; j <=m; j++) {
                System.out.print(c[i][j]+"\t");
                if(j==m){
                    System.out.println();
                }
            }
        }
        //printPack(c, w, m, n);

    }

 /**
     * @param m 表示背包的最大容量
     * @param n 表示商品個數
     * @param w 表示商品重量數組
     * @param p 表示商品價值數組
     * @param c[i][m] 前i個物體放入容量為m的背包的最大價值
     * @param c[i-1][m] 前i-1個物體放入容量為m的背包的最大價值
     * @param c[i-1][m-w[i]] 前i-1個物體放入容量為m-w[i]的背包的最大價值
     */
    public static int[][] BackPack_Solution(int m, int n, int[] w, int[] p) {
        //c[i][]表示前i件物品恰放入一個重量為m的背包可以獲得的最大價值
        int c[][] = new int[n + ][m + ];//建立數組
        for (int i = ; i < n + ; i++) {
            for (int j = ; j < m + ; j++) {
                if(i ==  || j == )
                    c[i][j] = ;//将放入物體為空 和 背包容量為0的情況 價值置0
                else if(w[i - ] <= j){//背包容量足以放下 物品 w[i-1]時, 判斷放入資料能否使背包價值增加
                    if (c[i - ][j] < (c[i - ][j - w[i - ]] + p[i - ]))
                            c[i][j] = c[i - ][j - w[i - ]] + p[i - ];//能則存入
                    } else
                        c[i][j] = c[i - ][j];//否則不放入
                }
                //當物品為i件重量為j時,如果第i件的重量(w[i-1])小于重量j時,c[i][j]為下列兩種情況之一:
                //(1)物品i不放入背包中,是以c[i][j]為c[i-1][j]的值
                //(2)物品i放入背包中,則背包剩餘重量為j-w[i-1],是以c[i][j]為c[i-1][j-w[i-1]]的值加上目前物品i的價值

        }
        return c;
    }
}