题解 | #购物单#

购物单

https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4


思路:
首先对输入分组,每组包含一个主要的和可能有的附加物品,使用一个vector记录主要物品的idx,再使用两个vector存放价格和满意度(二维的数组,三列,第一列是主物品,二三是附加,如果没有为0);
之后构建dp矩阵,当前值为max(上一格的值, 当前主物品+附加品的四个状态的满意度+剩余钱上一行对应的满意度)。
#include<iostream>
#include<math.h>
#include<vector>
using namespace std;

int main(){
    int N,m;
    cin>>N>>m;
    N /= 10;
    vector<int> idx;
    vector<vector<int>> price(m+1,vector<int>(3,0));
    vector<vector<int>> weight(m+1,vector<int>(3,0));
    for(int i = 1; i<=m; ++i){
        int a,b,c;
        cin >> a >> b >> c;
        a /= 10; b *= a;
        if(c == 0){
            price[i][0] = a; weight[i][0] = b;
            idx.push_back(i);
        }else{
            if(price[c][1] == 0) {
                price[c][1] = a; weight[c][1] = b;
            }else{
                price[c][2] = a; weight[c][2] = b;
            }
        }
    }
    int size = idx.size();
    vector<vector<int>> dp(size+1, vector<int>(N+1,0));
    for(int i = 1; i <= size; ++i){
        int id = idx[i-1];
        int a = price[id][0], b = weight[id][0];
        int c = price[id][1], d = weight[id][1];
        int e = price[id][2], f = weight[id][2];
        for(int j = 1; j<= N; ++j){
            dp[i][j] =  dp[i-1][j];
            if(a+c+e<=j) dp[i][j] = max((b+d+f) + dp[i-1][j-a-c-e],dp[i][j]);
            if(a+c<=j) dp[i][j] = max((b+d) + dp[i-1][j-a-c],dp[i][j]);
            if(a+e<=j) dp[i][j] = max((b+f) + dp[i-1][j-a-e],dp[i][j]);
            if(a<=j) dp[i][j] = max((b) + dp[i-1][j-a],dp[i][j]);
        }
    }
    cout<<dp[size][N]*10<<endl;
    
    return 0;
}




#动态规划##华为##华为笔试#
全部评论

相关推荐

04-03 18:59
吉林大学 Java
大专人陈义:别投了,我看到有人点了第二个链接投递,还没退出界面,不合适的邮件就发过来了
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

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