牛妹的春游

 分析:

  这是道二维费用的背包问题,可以像01背包一样优化掉第一维的决策,选或不选这个袋子,然后需要像01背包一样倒序循环体积,和01背包的优化一样。

  其次,这道题的难点是可以买多,只要买够就行,我们只需要对负数的体积取0就行,表示我们即使当前需要的饮料小于袋子中的饮料数量,我们依然可以购买,只要从0决策转移过来就行。

class Solution {
public:
    int dp[2000][2000];
    int minCost(int a, int b, vector<vector<int> >& p) {
        memset(dp, 0x3f, sizeof dp);
        dp[0][0] = 0;
        for (int i = 0; i < p.size(); ++i)
            for (int j = a; j >= 0; --j)
                for (int k = b; k >= 0; --k)
                {
                    dp[j][k] = min(dp[j][k], dp[max(j - p[i][0], 0)][max(k - p[i][1], 0)] + p[i][2]);
                }
        return dp[a][b];
    }
};
原文地址:https://www.cnblogs.com/yonezu/p/13409789.html