動態規劃求解揹包問題(JAVA實現)

package com.knapsack.problem;

public class BackPack {
    //主函數
    public static void main(String[] args) {
        int m = 10;//揹包最大容量爲10
        int n = 3;//商品個數爲3
        int w[] = {3, 4, 5};//商品的重量 
        int p[] = {4, 5, 6};//商品的價值
        int c[][] = BackPack_Solution(m, n, w, p);//儲存運算過程的數組
        for (int i = 0; i <=n; i++) {
            for (int j = 0; 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 + 1][m + 1];//創建數組
        for (int i = 0; i < n + 1; i++) {
            for (int j = 0; j < m + 1; j++) {
                if(i == 0 || j == 0)
                    c[i][j] = 0;//將放入物體爲空 和 揹包容量爲0的情況 價值置0
                else if(w[i - 1] <= j){//揹包容量足以放下 物品 w[i-1]時, 判斷放入數據能否使揹包價值增加
                    if (c[i - 1][j] < (c[i - 1][j - w[i - 1]] + p[i - 1]))
                            c[i][j] = c[i - 1][j - w[i - 1]] + p[i - 1];//能則存入
                    } else
                        c[i][j] = c[i - 1][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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章