题解 | #购物单#

购物单

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

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

int main() {
    int N, m;
    cin >> N >> m;
    N /= 10;    // 价格是10的倍数
    // 两个数组存储每个商品的价格和重要度
    vector<vector<int>> price(m+1, vector<int>(3, 0));  //  [主][附1][附2]
    vector<vector<int>> value(m+1, vector<int>(3, 0));
    
    // 动态规划dp[i][j]:i为物品位置,总价格不超过j的最大满意度
    vector<vector<int>> dp(m+1, vector<int>(N+1, 0));   
    for(int i=1; i<=m; ++i) {
        int v, p, q;
        cin >> v >> p >> q;
        if(q == 0) {
            // 主件
            price[i][0] = v/10;
            value[i][0] = p;
        }
        else {
            if(value[q][1] == 0) {  // 第一个附件
                price[q][1] = v/10;
                value[q][1] = p;
            }
            else {                  // 第二个附件
                price[q][2] = v/10;
                value[q][2] = p;
            }
        }
    }

    for(int i=1; i<=m; ++i) {
        int price1 = price[i][0], value1 = value[i][0];
        int price2 = price[i][1], value2 = value[i][1];
        int price3 = price[i][2], value3 = value[i][2];
        for(int j=1; j<=N; ++j) {
            dp[i][j] = j >= price1 ? max(dp[i-1][j-price1] + price1*value1, dp[i-1][j]) : dp[i-1][j];
            dp[i][j] = j >= price1+price2 ? max(dp[i-1][j-price1-price2] + price1*value1 + price2*value2, dp[i][j]) : dp[i][j];
            dp[i][j] = j >= price1+price3 ? max(dp[i-1][j-price1-price3] + price1*value1 + price3*value3, dp[i][j]) : dp[i][j];
            dp[i][j] = j >= price1+price2+price3 ? max(dp[i-1][j-price1-price2-price3] + price1*value1 + price2*value2 + price3*value3, dp[i][j]) : dp[i][j];
        }
    }

    cout << dp[m][N]*10;

    return 0;
}
// 64 位输出请用 printf("%lld")

注意动态规划递推公式

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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