题解 | 购物单

购物单

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

#include<bits/stdc++.h>
using namespace std;
int main() {
    int a, b;  // a:预算,b:物品数
    cin >> a >> b;
    vector<vector<int>> arr(3, vector<int>(b, 0));  // 存储输入
    vector<vector<int>> brr(6, vector<int>(b, 0));  // 存储主件及其附件信息
    // brr[0][]主件价格 brr[1][]主件重要度
    // brr[2][]附件价格 brr[3][]附件重要度
    // brr[4][]附件价格 brr[5][]附件重要度
    // 输入模块
    for (int i = 0; i < b; i++) {
        cin >> arr[0][i] >> arr[1][i] >> arr[2][i];
    }
    // 整合为brr
    for (int i = 0; i < b; i++) {
        if (arr[2][i] == 0) {
            brr[0][i] = arr[0][i];
            brr[1][i] = arr[1][i];
        } else {
            int c = arr[2][i] - 1;
            if (brr[2][c] == 0) {
                brr[2][c] = arr[0][i];
                brr[3][c] = arr[1][i];
            } else {  // 第二个附件
                brr[4][c] = arr[0][i];
                brr[5][c] = arr[1][i];
            }
        }
    }
    // 动态规划部分
    vector<int> dp(a + 1,0);  // dp动态数组初始化,a+1表示总共有a+1项,0表示从0开始
    for (int i = 0; i < b; i++) {
        if (brr[0][i] == 0) continue;  // 跳过不存在有效数据的行
        // 生成所有可能的组合
        vector<pair<int, int>> c;//c={{价格, 满意度},{价格, 满意度}...}
        // 组合1:仅主件
        c.push_back({brr[0][i], brr[0][i] * brr[1][i]});
        // 组合2:主件+附件1
        if (brr[2][i] != 0) {
            c.push_back({brr[0][i] + brr[2][i],
                         brr[0][i] * brr[1][i] + brr[2][i] * brr[3][i]});
        }
        // 组合3:主件+附件2
        if (brr[4][i] != 0) {
            c.push_back({brr[0][i] + brr[4][i],
                         brr[0][i] * brr[1][i] + brr[4][i] * brr[5][i]});
        }
        // 组合4:主件+附件1+附件2
        if (brr[2][i] != 0 && brr[4][i] != 0) {
            c.push_back({brr[0][i] + brr[2][i] + brr[4][i],
                         brr[0][i] * brr[1][i] + brr[2][i] * brr[3][i] + brr[4][i] * brr[5][i]});
        }
        // 更新dp数组!!
        for (int j = a; j >= 0; j--) {
            for (auto& d : c) {  //d引用读取结构体c的记录
                if (j >= d.first) {
                    dp[j] = max(dp[j], dp[j - d.first] + d.second);//更新核心
                }
            }
        }
    }
    cout << dp[a] << endl;
    return 0;
}

#dp#
全部评论

相关推荐

点赞 评论 收藏
分享
05-19 19:57
蚌埠学院 Python
2237:Gpa70不算高,建议只写排名,个人技能不在多而在精,缩到8条以内。项目留一个含金量高的,减少间距弄到一页,硕士简历也就一页,本科不要写很多
实习,投递多份简历没人回...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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