LintCode 125.揹包問題II
揹包問題
確定狀態:
- 對於每個總重量,我們知道對應的最大價值是多少,就能知道答案。
- 最後一步: 最後一個物品:(,價值:)是否進入揹包。
- 情況一: 如果前個物品能拼出,最大總價值是,前個物品也能拼出並且總價值是
- 情況二: 如果前N-1個物品能拼出,最大總價值是V,則再加上最後一個物品(重量, 價值,能拼出,總價值是
- 狀態:
f[i][w]
用前i
個物品拼出重量w
時最大總價值(-1
表示不能拼出w
)
轉移方程:f[i][w]=max(f[i-1][w],f[i-1][w-A[i-1]]+V[i-1])
初始條件和邊界:
在轉移方程中:w>A[i-1]&&f[i-1][w-A[i-1]]!=-1
0個物品可以拼出重量0,最大總價值爲0:f[0][0]=0
0個物品不能拼出大於0的重量:f[0][1..M]=-1
public class Solution {
/**
* @param m: An integer m denotes the size of a backpack
* @param A: Given n items with size A[i]
* @param V: Given n items with value V[i]
* @return: The maximum value
*/
public int backPackII(int m, int[] A, int[] V) {
// write your code here
int n=A.length;
if(n==0)
return 0;
int [][]f=new int[n+1][m+1];
Arrays.fill(f[0],-1);
f[0][0]=0;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=m;j++)
{
f[i][j]=f[i-1][j];
if(j>=A[i-1])
if(f[i-1][j-A[i-1]]!=-1)
f[i][j]=Math.max(f[i][j],f[i-1][j-A[i-1]]+V[i-1]);
}
}
int res=0;
for(int i=0;i<=m;i++)
{
res=Math.max(res,f[n][i]);
}
return res;
}
}