lintcode揹包問題
阿新 • • 發佈:2018-10-31
題目:
在n個物品中挑選若干物品裝入揹包,最多能裝多滿?假設揹包的大小為m,每個物品的大小為A[i]
樣例:
如果有4個物品[2, 3, 5, 7]
如果揹包的大小為11,可以選擇[2, 3, 5]裝入揹包,最多可以裝滿10的空間。
如果揹包的大小為12,可以選擇[2, 3, 7]裝入揹包,最多可以裝滿12的空間。
函式需要返回最多能裝滿的空間大小。
解析:
動態規劃問題,關鍵在構建狀態轉移方程
令f(i)(j)表示 :前i個物品,是否能填滿容量為j的揹包
可以分兩種情況:
- 揹包能容下第i個物品,則我們要看前i-1個物品是否能填滿j-A(i),即f(i)(j)=f(i-1,j-A(i))
- 揹包不能容下第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; }