第一场(C-牛妹的春游)

链接:https://ac.nowcoder.com/acm/contest/6218/C
来源:牛客网

题目描述:
众所周知,牛妹要组织公司的出游。要准备面包和饮料。她买到的面包和饮料都是捆绑销售的,也就是说,一个大包装里面x个面包+y个饮料,花费t元。
为了满足公司的要求,需要一定数量的面包和饮料。
你的任务就是帮助牛妹计算,为了满足公司需要,一共最少花费多少钱。

示例1
输入
5,60,[[3,36,120],[10,25,129],[5,50,250],[1,45,130],[4,20,119]]
输出
249
备注:
每种大包装只能最多买一个,所需面包breadNum、饮料的总量beverageNum均不超过2000
牛妹一定能找到满足要求的方案让大家能够出游。
解题思路:
每个包装只能买一次,经典的01背包问题(容量倒序遍历)。因为购买的面包和饮料可以多于需要的数量,所以dp数组的状态转移公式需要略作修改。
代码:

class Solution {
public:
    /**
     * 
     * @param breadNum int整型 
     * @param beverageNum int整型 
     * @param packageSum int整型vector<vector<>> 每个一维数组中有三个数,依次表示这个包装里面的面包数量、饮料数量、花费
     * @return int整型
     */
    int minCost(int br, int be, vector<vector<int>>& pkg) {
        // write code here
        int dp[2005][2005];
        memset(dp, 0x3f3f3f3f, sizeof(dp));
        dp[0][0] = 0;
        for(auto& p : pkg) {
            for(int i = br; i >= 0; --i) {
                for(int j = be; j >= 0; --j) {
                    dp[i][j] = min(dp[i][j], dp[max(0, i - p[0])][max(0, j - p[1])] + p[2]);
                }
            }
        }
        return dp[br][be];
    }
};
全部评论

相关推荐

11-27 12:43
已编辑
门头沟学院 C++
点赞 评论 收藏
分享
11-04 14:10
东南大学 Java
_可乐多加冰_:去市公司包卖卡的
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务