1. 程式人生 > >lintcode揹包問題

lintcode揹包問題

題目:
在n個物品中挑選若干物品裝入揹包,最多能裝多滿?假設揹包的大小為m,每個物品的大小為A[i]
樣例:
如果有4個物品[2, 3, 5, 7]
如果揹包的大小為11,可以選擇[2, 3, 5]裝入揹包,最多可以裝滿10的空間。
如果揹包的大小為12,可以選擇[2, 3, 7]裝入揹包,最多可以裝滿12的空間。
函式需要返回最多能裝滿的空間大小。
解析:
動態規劃問題,關鍵在構建狀態轉移方程
令f(i)(j)表示 :前i個物品,是否能填滿容量為j的揹包
可以分兩種情況:

  1. 揹包能容下第i個物品,則我們要看前i-1個物品是否能填滿j-A(i),即f(i)(j)=f(i-1,j-A(i))
  2. 揹包不能容下第i個物品,則我們要看前i-1個物品是否能填滿j,即f(i)(j)=f(i-1)(j)

程式碼:

public int backPack(int m, int[] A) {
        // write your code here
        if(A == null || A.length == 0 || m <= 0)
            return 0;
 
        int n = A.length;
 
        boolean[][] dp = new boolean[n + 1][m + 1];
        dp[0][0] = true;
 
        for(int i = 1; i <= n; i++){
            for(int j = 0; j <= m; j++){
                if(j >= A[i - 1] && dp[i - 1][j - A[i - 1]])
                    dp[i][j] = true;
                else if(dp[i - 1][j])
                    dp[i][j] = true;
            }
        }
 
        for(int i = m; i >= 0; i--)
            if(dp[n][i])
                return i;
 
        return 0;
    }