LintCode 125.揹包問題II

LintCode 125.揹包問題II

揹包問題

確定狀態:

  • 對於每個總重量,我們知道對應的最大價值是多少,就能知道答案。
  • 最後一步: 最後一個物品:(AN1重量:A_{N-1},價值:VN1V_{N-1})是否進入揹包。
  • 情況一: 如果前N1N-1個物品能拼出WW,最大總價值是VV,前NN個物品也能拼出WW並且總價值是VV
  • 情況二: 如果前N-1個物品能拼出WAN1W- A_{N-1},最大總價值是V,則再加上最後一個物品(重量AN1A_{N-1}, 價值VN1)V_{N-1)},能拼出WW,總價值是V+VN1V+V_{N-1}
  • 狀態: 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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章