题解 | 购物单 非常繁琐的01背包问题

购物单

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

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

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

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

int main() {
    int Money;
    int Count;

    while (cin >> Money >> Count) {
        Money /= 10;
        vector<vector<int>> Info(Count + 1, vector<int>(3, 0));
        vector<int> main;
        unordered_map<int, vector<int>> Main_connection;
        for (int i = 1; i <= Count; i++) {
            int a, b, c;
            cin >> a >> b >> c;
            Info[i][0] = a / 10;
            Info[i][1] = b;
            Info[i][2] = c;
            if (c == 0) {
                main.push_back(i);
            }
            if (c != 0) {
                Main_connection[c].push_back(i);
            }
        }
        vector<int> value(Count + 1, 0);
        for (int i = 1; i <= Count; i++) {
            value[i] = Info[i][0] * Info[i][1];
        }
        vector<vector<int>> dp(main.size() + 1, vector<int>(Money + 1, 0));

        for (int i = 1; i <= main.size(); i++) {
            int main_id = main[i - 1];
            for (int j = 0; j <= Money; j++) {
                // 不选当前主件
                dp[i][j] = dp[i - 1][j];

                // 选当前主件
                if (j >= Info[main_id][0]) {
                    dp[i][j] = max(dp[i][j], dp[i - 1][j - Info[main_id][0]] + value[main_id]);
                }

                // 选当前主件 + 附件 1
                if (Main_connection[main_id].size() >= 1 && j >= Info[main_id][0] + Info[Main_connection[main_id][0]][0]) {
                    dp[i][j] = max(dp[i][j], dp[i - 1][j - Info[main_id][0] - Info[Main_connection[main_id][0]][0]] + value[main_id] + value[Main_connection[main_id][0]]);
                }

                // 选当前主件 + 附件 2
                if (Main_connection[main_id].size() >= 2 && j >= Info[main_id][0] + Info[Main_connection[main_id][1]][0]) {
                    dp[i][j] = max(dp[i][j], dp[i - 1][j - Info[main_id][0] - Info[Main_connection[main_id][1]][0]] + value[main_id] + value[Main_connection[main_id][1]]);
                }

                // 选当前主件 + 附件 1 + 附件 2
                if (Main_connection[main_id].size() >= 2 && j >= Info[main_id][0] + Info[Main_connection[main_id][0]][0] + Info[Main_connection[main_id][1]][0]) {
                    dp[i][j] = max(dp[i][j], dp[i - 1][j - Info[main_id][0] - Info[Main_connection[main_id][0]][0] - Info[Main_connection[main_id][1]][0]] + value[main_id] + value[Main_connection[main_id][0]] + value[Main_connection[main_id][1]]);
                }
            }
        }
        cout << dp[main.size()][Money] * 10 << endl;
    }
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

买蜜雪也用卷:我觉得应该没有哪个人敢说自己熟练使用git,代码分支一复杂还是得慢慢寻思一下的,不过基本的拉代码提交代码还有分支什么的是应该会
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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