题解 | #购物单#

购物单

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

#include <cstddef>
#include <ios>
#include <iostream>
#include <bits/stdc++.h>
using namespace std;

int N,m;

void max_satis(){
    int v,p,MS;
    vector<vector<int>> v_vet(m,vector<int> (1,0));
    vector<vector<int>> vp_vet(m,vector<int> (1,0));

    for(int i = 0; i < m; i++){
        cin >> v >> p >> MS;
        if(MS == 0){
            v_vet[i][0] = v;
            vp_vet[i][0] = v * p;
        }
        else{
            v_vet[MS-1].push_back(v);
            vp_vet[MS-1].push_back(v*p);
        }
    }

    vector<vector<int>> dp(m, vector<int>(N+1, 0));

    //初始化
    for(int j = v_vet[0][0]; j <= N; j++){
        if(j >= v_vet[0][0]+v_vet[0][1]+v_vet[0][2]) dp[0][j] = vp_vet[0][0]+vp_vet[0][1]+vp_vet[0][2];
        else if(j >= max(v_vet[0][0]+v_vet[0][1],v_vet[0][0]+v_vet[0][2]))    dp[0][j] = max(vp_vet[0][0]+vp_vet[0][1],vp_vet[0][0]+vp_vet[0][2]);
        else if(j >= min(v_vet[0][0]+v_vet[0][1],v_vet[0][0]+v_vet[0][2]))  dp[0][j] = (min(v_vet[0][0]+v_vet[0][1],v_vet[0][0]+v_vet[0][2]) == v_vet[0][0]+v_vet[0][1])?vp_vet[0][0]+vp_vet[0][1]:vp_vet[0][0]+vp_vet[0][2];
        else dp[0][j] = vp_vet[0][0];
    }

    for(int i = 1; i < m; i++){
        for(int j = 1; j < N+1; j++){
            //主
            if(v_vet[i][0] > j) dp[i][j] = dp[i-1][j];
            else dp[i][j] = max(dp[i-1][j],dp[i-1][j-v_vet[i][0]]+vp_vet[i][0]);
            //主+附1
            if(v_vet[i][0] + v_vet[i][1] > j) dp[i][j] = dp[i][j];
            else dp[i][j] = max(dp[i][j],dp[i-1][j-v_vet[i][0]-v_vet[i][1]]+vp_vet[i][0]+vp_vet[i][1]);
            //主+附2
            if(v_vet[i][0] + v_vet[i][2] > j) dp[i][j] = dp[i][j];
            else dp[i][j] = max(dp[i][j],dp[i-1][j-v_vet[i][0]-v_vet[i][2]]+vp_vet[i][0]+vp_vet[i][2]);
            //主++附1+附2
            if(v_vet[i][0] + v_vet[i][1] + v_vet[i][2] > j) dp[i][j] = dp[i][j];
            else dp[i][j] = max(dp[i][j],dp[i-1][j-v_vet[i][0]-v_vet[i][1]-v_vet[i][2]]+vp_vet[i][0]+vp_vet[i][1]+vp_vet[i][2]);
        }
        
    }
    cout << dp[m-1][N] << endl;
}


int main() {
    cin >> N >> m;
    max_satis();
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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