题解 | #购物单#

购物单

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

#include<iostream>
#include<math.h>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;

int main(){
    int N,m;
    cin >> N >> m;
    N/=10;
    vector<int> V,P,Q;
    map<int,vector<int>> dict;
    int v,p,q;
    for(int i=0;i<m;i++){
        cin >> v >> p >> q;
        v/=10;
        V.push_back(v);
        P.push_back(p);
        Q.push_back(q);
        dict[q].push_back(i);
     }
    int id_1,id_2;
    int len=dict[0].size();
    vector<vector<pair<int,int>>>rec(len);
    for(int i=0;i<len;i++){
        int x=dict[0][i];
        rec[i].push_back(make_pair(V[x],V[x]*P[x]));
        if(dict[x+1].size()==2){
            id_1=dict[x+1][0];
            id_2=dict[x+1][1];
            rec[i].push_back(make_pair(V[id_1]+V[x],P[id_1]*V[id_1]+P[x]*V[x]));
            rec[i].push_back(make_pair(V[id_2]+V[x],P[id_2]*V[id_2]+P[x]*V[x]));
            rec[i].push_back(make_pair(V[id_1]+V[id_2]+V[x],P[id_1]*V[id_1]+P[id_2]*V[id_2]+P[x]*V[x]));   
        }
        else if(dict[x+1].size()==1) {
            id_1=dict[x+1][0];
            rec[i].push_back(make_pair(V[id_1]+V[x],P[id_1]*V[id_1]+P[x]*V[x]));
        }
    }
    
    vector<vector<int>> dp(len+1,vector<int>(N+1,0));
    for(int i=1;i<=len;i++){
        for(int j=1;j<=N;j++){
            int cur=0;
            for(int k=0;k<rec[i-1].size();k++){
                int price=rec[i-1][k].first;
                int good=rec[i-1][k].second;
                if(j-price>=0){
                    cur=max(cur,dp[i-1][j-price]+good);
                }
            }    
            dp[i][j]=max(dp[i-1][j],cur);   
        }
    }
    cout<<dp[len][N]*10;
    
}

将有依赖关系的背包问题化解为分组背包问题即可
全部评论

相关推荐

一颗宏心:华为HR晚上过了十二点后还给我法消息。
点赞 评论 收藏
分享
11-08 13:58
门头沟学院 Java
程序员小白条:竟然是蓝桥杯人才doge,还要花钱申领的offer,这么好的公司哪里去找
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务