题解 | #购物单#

购物单

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;
    vector<vector<int>> nums(m + 1, vector<int>(6));
    int v, w, p;
    for (int i = 1; i <= m; i ++ )
    {
        cin >> v >> w >> p;
        if (!p) nums[i][0] = v / 10, nums[i][1] = w;
        else if (!nums[p][2]) nums[p][2] = v / 10, nums[p][3] = w;
        else nums[p][4] = v / 10, nums[p][5] = w;
    }
    vector<vector<int>> f(m + 1, vector<int>(n + 1, 0));
    for (int i = 1; i <= m; i ++ )
    {
        for (int j = 1; j <= n; j ++ )
        {
            int v0 = nums[i][0], w0 = nums[i][1], v1 = nums[i][2], w1 = nums[i][3], v2 = nums[i][4], w2 = nums[i][5];
            f[i][j] = f[i - 1][j];
            if (j >= v0) f[i][j] = max(f[i][j], f[i - 1][j - v0] + v0 * w0);
            if (j >= v0 + v1) f[i][j] = max(f[i][j], f[i - 1][j - v0 - v1] + v0 * w0 + v1 * w1);
            if (j >= v0 + v1 + v2) f[i][j] = max(f[i][j], f[i - 1][j - v0 - v1 - v2] + v0 * w0 + v1 * w1 + v2 * w2);
            if (j >= v0 + v2) f[i][j] = max(f[i][j], f[i - 1][j - v0 - v2] + v0 * w0 + v2 * w2);
        }
    }
    cout << f[m][n] * 10 << endl;
    return 0;
}

// 64 位输出请用 printf("%lld")

全部评论

相关推荐

点赞 2 评论
分享
牛客网
牛客企业服务