求助求助
#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;
}