1. 程式人生 > >LintCode 92: Backpack (經典01揹包問題)

LintCode 92: Backpack (經典01揹包問題)

經典01揹包問題。 DP solution。 Time complexity O(nm),n is the # of items, m is the packet size。 Space complexity O(m)。 注意:k迴圈必須從大到小 (對01揹包和重複揹包)。而如果是完全揹包的話,可以是從小到大,從而實現優化。


class Solution {
public:
    /**
     * @param m: An integer m denotes the size of a backpack
     * @param A: Given n items with size A[i]
     * @return: The maximum size
     */
    int backPack(int m, vector<int> &A) {
        int n = A.size();
        vector<int> dp(m + 1, 0);
        
        for (int i = 0; i < n; ++i) {
            for (int k = m; k >= A[i]; --k) {    //必須是從大到小
                dp[k] = max(dp[k], dp[k - A[i]] + A[i]);
            }
        }
        return dp[m];
    }
};