刷题-hw机考-HJ16-购物单

// https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4
// 牛客-hw机考-HJ16 购物单

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

struct GiftInfo {
    int v {};
    int satisfaction {};
};

void Solution()
{
    int N = 0;
    int m = 0;

    cin >>N >>m;
    vector<vector<GiftInfo> > giftInfo(m+1, vector<GiftInfo>(3, {0}));

    for (int i = 1; i <= m; ++i) {
        int v, p, q {};
        cin >> v >>p >>q;

        int mainItems   = q > 0 ? q : i;
        int ItemsBelong = q > 0 ? (giftInfo[q][1].v == 0 ? 1 : 2) : 0;

        giftInfo[mainItems][ItemsBelong].v = v;
        giftInfo[mainItems][ItemsBelong].satisfaction = v * p;
    }

    int totalAmount = N / 10;
    vector<vector<int> > dp(m+1, vector<int>(totalAmount+1, {0}));
    for (int i = 1; i <= m; ++i) {
        int v  = 0,                   sf = 0;
        int v0 = giftInfo[i][0].v/10, sf0 = giftInfo[i][0].satisfaction/10;
        int v1 = giftInfo[i][1].v/10, sf1 = giftInfo[i][1].satisfaction/10;
        int v2 = giftInfo[i][2].v/10, sf2 = giftInfo[i][2].satisfaction/10;
        for (int j = 1; j <= totalAmount; j++) {
            v = v0; sf = sf0;
            dp[i][j] = j >= v ? max(dp[i-1][j-v] + sf, dp[i-1][j]) : dp[i-1][j];

            v = v0 + v1; sf = sf0 + sf1;
            dp[i][j] = j >= v ? max(dp[i-1][j-v] + sf, dp[i][j]) : dp[i][j];

            v = v0 + v2; sf = sf0 + sf2;
            dp[i][j] = j >= v ? max(dp[i-1][j-v] + sf, dp[i][j]) : dp[i][j];

            v = v0 + v1 + v2; sf = sf0 + sf1 + sf2;
            dp[i][j] = j >= v ? max(dp[i-1][j-v] + sf, dp[i][j]) : dp[i][j];
        }
    }

    cout << dp[m][totalAmount]*10 <<endl;
}

int main()
{
    Solution();
    return 0;
}

 

posted @ 2022-04-10 21:22  天高云肆  阅读(96)  评论(0)    收藏  举报