金明呀~
查看原帖
金明呀~
592442
Crism_qwq楼主2022/11/17 13:40

求助求助

#include<bits/stdc++.h>
using namespace std;
int q[40005];
int n,m,a[40005],b[40005],maxx=-1,s[40005],dp[32005],sum1[40005],sum2[40005];//a数组存储金钱 b数组存储价值 s数组存储乘积
int main(){
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        cin>>a[i]>>b[i]>>q[i];//常规输入
        if(q[i]==0){//如果是主件的话
            s[i]=a[i]*b[i];//算出价值金钱的乘积
        }else{//否则是附件
            s[i]=a[i]*b[i]+a[q[i]]*b[q[i]];//给附件的价值金钱乘积加上主件的价值金钱乘积
            sum1[q[i]]+=a[i];//用sum1存储两个附件的总重量
            sum2[q[i]]+=s[i];//存储两个附件的总乘积
            a[i]=a[q[i]]+a[i];//更新当前附件的重量变成主件加附件
        }
        dp[i]=s[i];//浅浅赋值一下
    }
    for(int i=1;i<=n;i++){
        for(int j=n;j>=a[i];j--){
            if(q[i]==0)/*如果是主件*/dp[j]=max(dp[j],dp[j-a[i]]+s[i]);//判断取还是不取
            if(q[i]>0&&j-sum1[q[i]]+a[i]-a[q[i]]-a[q[i]]>0) dp[j]=max(dp[j],dp[j-sum1[q[i]]+a[i]-a[q[i]]-a[q[i]]]+sum2[q[i]]-s[i]+s[q[i]]+s[q[i]]/*买主件以及另外一个配件*/);
            if(q[i]>0&&j-sum1[q[i]]-a[q[i]]>0) dp[j]=max(dp[j],dp[j-sum1[q[i]]-a[q[i]]]+sum2[q[i]]+s[q[i]]/*两个配件都买*/);
            if(q[i]>0&&j-a[q[i]]>0) dp[j]=max(dp[j],dp[j-a[q[i]]]+s[q[i]]);
            else if(q[i]>0) dp[j]=max(dp[j],dp[j-a[i]]+s[i]);
        }
    }
    cout<<dp[n];//输出
    return 0;
}
2022/11/17 13:40
加载中...