分析:
这是道二维费用的背包问题,可以像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]; } };