题解 | 购物单

购物单

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

#include <iostream>
#include <vector>
using namespace std;
#define ll long long
const int N=65;
int n,m;
int v[N],w[N],q[N];
vector<int> extra[N];
vector<int> main_id;
int dp[3005];
int main() {
    scanf("%d%d",&m,&n);//预算,个数
    m/=10;
    for(int i=1;i<=n;++i){
        scanf("%d%d%d",&v[i],&w[i],&q[i]);
        v[i]/=10;
        if(q[i]!=0){
            extra[q[i]].push_back(i);
        }
        else{
            main_id.push_back(i);
        }
    }
    for(int i:main_id){
        vector<pair<int,int>> vw;
        vw.emplace_back(v[i],v[i]*w[i]);
        for(int j:extra[i]){
            for(int k=0,t=vw.size();k<t;++k){
                vw.emplace_back(vw[k].first+v[j],vw[k].second+v[j]*w[j]);
            }
        }
        for(int j=m;j>=v[i];--j){
            for(auto [price,weight]:vw){
                if(j-price>=0){
                    dp[j]=max(dp[j],dp[j-price]+weight);
                }
            }
        } 
    }
    int res=0;
    for(int i=1;i<=m;++i){
        res=max(res,dp[i]);
    }
    cout<<res*10<<endl;
}

全部评论

相关推荐

12-24 20:52
武汉大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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