题解 | #购物单#

购物单

https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4?tpId=37&tqId=21239&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

struct Condition{
    int one;
    int two;
    int three;
    int four;
};

struct Goods{
    Condition price;
    Condition weight;
    int key;
};

bool cmp(Goods num1, Goods num2){
    return num1.key < num2.key;
}

int main(){
    int n, m;
    while(cin >> m >> n){
        vector<Goods> goods(n + 1);
        vector<Goods> m1goods;
        for(int i = 1; i <= n; i++){
            cin >> goods[i].weight.one >> goods[i].price.one >> goods[i].key;
            goods[i].price.one = goods[i].price.one * goods[i].weight.one;
            goods[i].price.two = goods[i].price.three = goods[i].price.four = goods[i].price.one;
            goods[i].weight.two = goods[i].weight.three = goods[i].weight.four = goods[i].weight.one;
        }
        for(int i = 1; i < n + 1; i++){
            if(goods[i].key != 0 && goods[goods[i].key].price.one == goods[goods[i].key].price.two){//出现的第一个附件
                goods[goods[i].key].price.two = goods[i].price.one + goods[goods[i].key].price.one;
                goods[goods[i].key].weight.two = goods[i].weight.one + goods[goods[i].key].weight.one;
            }else if(goods[i].key != 0){//出现的第二个附件
                goods[goods[i].key].price.three = goods[i].price.one + goods[goods[i].key].price.one;
                goods[goods[i].key].price.four = goods[i].price.one + goods[goods[i].key].price.two;
                goods[goods[i].key].weight.three = goods[i].weight.one + goods[goods[i].key].weight.one;
                goods[goods[i].key].weight.four = goods[i].weight.one + goods[goods[i].key].weight.two;
            }else{

            }
        }
        for(int i = 1; i < n + 1; i++){
            if(goods[i].key == 0)
                m1goods.push_back(goods[i]);
        }
        int **dp = new int*[m1goods.size()];
        for(int i = 0; i < m1goods.size() + 1; i++){
            dp[i] = new int[m + 1];
        }
        for(int i = 0; i <= m1goods.size(); i++)
            for(int j = 0; j < m + 1; j++)
                dp[i][j] = 0;
        int temp = 0;
        for(int i = 1; i <= m1goods.size(); i++){
            temp = m1goods[i - 1].weight.one <= 1 && m1goods[i - 1].price.one > temp ? m1goods[i - 1].price.one : temp; 
            dp[i][1] = temp;
        }
        for(int i = 1; i < m + 1; i++)
            dp[1][i] = max(
                max(m1goods[0].weight.three <= i ? m1goods[0].price.three : 0, 
                    m1goods[0].weight.four <= i ? m1goods[0].price.four : 0), 
                max(m1goods[0].weight.one <= i ? m1goods[0].price.one : 0, 
                    m1goods[0].weight.two <= i ? m1goods[0].price.two : 0)
                );//取四种情况中的最大值。
        if (m1goods.size() == 1)    return 0;
        int ans = 0;
        for(int i = 2; i <= m1goods.size(); i++){
            for(int j = 2; j <= m; j++){
                dp[i][j] = max(dp[i - 1][j], 
                            max(
                                max(m1goods[i - 1].weight.one <= j ? dp[i - 1][j - m1goods[i - 1].weight.one] + m1goods[i - 1].price.one : 0, 
                                    m1goods[i - 1].weight.two <= j ? dp[i - 1][j - m1goods[i - 1].weight.two] + m1goods[i - 1].price.two : 0),
                                max(m1goods[i - 1].weight.three <= j ? dp[i - 1][j - m1goods[i - 1].weight.three] + m1goods[i - 1].price.three : 0, 
                                    m1goods[i - 1].weight.four <= j ? dp[i - 1][j - m1goods[i - 1].weight.four] + m1goods[i - 1].price.four : 0)
                                ));
                ans = dp[i][j] > ans ? dp[i][j] : ans;
            }
        }
        cout << ans;
    }
    return 0;
}

全部评论

相关推荐

10-17 16:48
已编辑
南方科技大学 图像识别
记录一下找工作的感受吧。鼠鼠硕士阶段搞的图像处理,用了深度学习比较成熟、简单的模型,技能点主要在科研上研二下学期准备找工作,先投AI、机器学习的暑期实习,没有结果。当时不想投开发,觉得太累了。后面找不到工作,就转开发了。但是八股不会,刷题不精,挂了好多笔试面试。在一个线下宣讲会获得了一个小科技公司的日常实习机会。我的实习公司,70%是应届生,共同话题很多。我问了算法部门刚入职的同事,一位同事硕士阶段和我的成果差不多。他们毕业院校一般,觉得算法很难,之后想换工作。我也有几个985硕科班算法的朋友,他们去找工作🈚压力。我等凡人不跟他们竞争了。工位旁还有几位java开发工程师,我需要他们提供接口给我,大概也了解了他们的工作内容。一个同事说弄懂java虚拟机最重要。而我看那些知识点觉得很枯燥,我想我还是稍喜欢现在的工作,主要画画ui。鼠鼠也蛮喜欢科研,但是科研压力很大,想出好文章有时违背本心。而且鼠鼠方向和工业界联系不紧密,挣不了大钱。如果出国的话,🇺🇸现在环境比较糟糕,签证很难弄。好几个朋友想出国申博,还没结果。祝他们好运吧,我就不想继续卷了。同学院其他找工作的女生同学,只能找营销,产品经理之类的岗位,她们不是很喜欢。我是本科有一些开发经历,加上学历过关,才能转码的。男生稍微好一点,但是专业原因找工作也是有一些困难。大概就记录到这里吧,供大家参考,尤其是和我一样不上不下背景,正在纠结的朋友。截图随便配的,这家公司投了之后懒得做测评,今天收到面试邀请,我懒得去了。位置在惠州,觉得很远。u1s1,开发的工作真的好多,不论老家,还是惠州这种城市,还是深圳,都很多。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务