题目
思路
面包和饮料作为两种价值,求其分配最小值,就是二位费用背包问题。但是这里要注意面包和饮料是可以超过所求值,就要在循环内扩大br与dr的值。并且可能第k个捆绑销售的物品不会购买,所以循环内不是i>=p[k][0]而是i>=0
代码
class Solution {
public:
/**
*
* @param breadNum int整型
* @param beverageNum int整型
* @param packageSum int整型vector<vector<>> 每个一维数组中有三个数,依次表示这个包装里面的面包数量、饮料数量、花费
* @return int整型
*/
int minCost(int br, int dr, vector<vector<int> >& p) {
int dp[2010][2010];
memset(dp,0x3f3f3f3f,sizeof dp);
dp[0][0]=0;
for(int k=0;k<p.size();k++){
for(int i=2*br;i>=0;i--){
for(int j=2*dr;j>=0;j--){
dp[i][j]=min(dp[i][j],dp[max(i-p[k][0],0)][max(j-p[k][1],0)]+p[k][2]);
}
}
}
return dp[br][dr];
}
};