LintCode 92.揹包問題

LintCode 92.揹包問題

揹包問題
對於每個總重量,我們能知道有沒有方案能做到,就可以解決。
揹包問題中,數組大小和總承重有關

確定狀態:
需要知道N個物品是否能拼出重量W(W=0,1,,M)W (W =0, 1, …, M)
最後一步:最後一個物品(重量AN1A_{N-1})是否進入揹包,**情況一:**如果前N1N-1個物品能拼出WW,當然前N個物品也能拼出WW。**情況二:**如果前N-1個物品能拼出WAN1W- A_{N-1} ,再加上最後的物品AN1A_{N-1} ,拼出WW
**狀態:**設f[i][w]=能否用前i個物品拼出重量w
轉移方程: f[i][w]=f[i-1][w] || f[i-1][w-A[i-1]]
初始條件和邊界情況:
i個物品可以拼出重量0:f[i][0]=true
0個物品不能拼出大於0的重量:f[0][1...M]=false
邊界w>A[i-1]時才能使用f[i-1][w-A[i-1]

public class Solution {
    /**
     * @param m: An integer m denotes the size of a backpack
     * @param A: Given n items with size A[i]
     * @return: The maximum size
     */
    public int backPack(int m, int[] A) {
        int n=A.length;
        if(m==0||n==0)
            return 0;
        boolean [][]f=new boolean[n+1][m+1];
        Arrays.fill(f[0],false);
        f[0][0]=true;
        for(int i=1;i<=n;i++)
        {
            f[i][0]=true;
            for(int j=1;j<=m;j++)
            {
                if(j>=A[i-1])
                f[i][j]=f[i-1][j]||f[i-1][j-A[i-1]];
                else
                f[i][j]=f[i-1][j];
            }
        }
        int res=0;
        for(int i=m;i>=0;i--)
        {
            if(f[n][i])
            {
                res=i;
                break;
            }
        }
        return res;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章