题解 | #购物单#

购物单

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

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

const int N = 65;
array<array<int, 33000>, N> f;
array<array<int, 5>, N>
a={0}; //a[i][0]表示编号为i的主件拥有的附件的数量,其余为附件编号
array<int, 65>pri={0}, impo={0}, qq={0};

int n, m;
int main() {
    cin >> n >> m;
    int v, p, q;
    for (int i = 1; i <= m; i++) { //初始化
        cin >> v >> p >> q;
        pri[i] = v;
        impo[i] = p;
        qq[i] = q;
        if (q != 0) {
            a[q][0]++;
            a[q][a[q][0]] = i;
        }
    }
    for (int i = 1; i <= m; i++) {
        if (qq[i] == 0) {
            for (int j = 0; j <= n; j++) {
                f[i][j] = f[i - 1][j];
                if (j >= pri[i])
                    f[i][j] = max(f[i][j], f[i - 1][j - pri[i]] + pri[i] * impo[i]);
                if (a[i][0] == 1 && j >= (pri[i] + pri[a[i][1]]))
                    f[i][j] = max(f[i][j], f[i - 1][j - pri[i] - pri[a[i][1]]] + pri[i] * impo[i] + pri[a[i][1]] * impo[a[i][1]]);
                if (a[i][0] == 2) {
                    if (j >= (pri[i] + pri[a[i][1]]))
                        f[i][j] = max(f[i][j], f[i - 1][j - pri[i] - pri[a[i][1]]] + pri[i] * impo[i] + pri[a[i][1]] * impo[a[i][1]]);
                    if (j >= (pri[i] + pri[a[i][2]]))
                        f[i][j] = max(f[i][j], f[i - 1][j - pri[i] - pri[a[i][2]]] + pri[i] * impo[i] + pri[a[i][2]] * impo[a[i][2]]);
                    if (j >= (pri[i] + pri[a[i][1]]+ pri[a[i][2]]))
                        f[i][j] = max(f[i][j], f[i - 1][j - pri[i] - pri[a[i][1]]- pri[a[i][2]]] + pri[i] * impo[i] + pri[a[i][1]] * impo[a[i][1]]+pri[a[i][2]] * impo[a[i][2]]);
                }
            }
        }
        else
            for(int j=0;j<=n;j++)
                f[i][j]=f[i-1][j];
    }
    cout<<f[m][n]<<endl;
    return 0;
    
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

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