https://www.luogu.com.cn/problem/P1064 求调,wa一个点。后附。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define mp make_pair
#define rd read()
inline int rd
{
int xx=0,ff=1;
char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') ff=-1;ch=getchar();}
while(ch>='0'&&ch<='9') xx=xx*10+(ch-'0'),ch=getchar();
return xx*ff;
}
inline void write(int out)
{
if(out<0) putchar('-'),out=-out;
if(out>9) write(out/10);
putchar(out%10+'0');
}
// void solve(){
// cerr<<"\nlong longrr[][]=";
// for(int i=1;i<=n;i++)cerr<<t[i].lst<<' '<<t[i].r<<endl;
// }
const int N=1e2+5;
const int M=5e4+5;
const int INF=2e9+5;
const int MOD=2e9+7;
bool f1;
int p[N],v[N],dp[N][M],n,m,k,cnt,ans,id[N],q[N];
vector<int> e[N];
signed main(){
n=rd,m=rd;
for(int i=1;i<=m;i++){
v[i]=rd;p[i]=rd;q[i]=rd;
if(q[i])e[q[i]].push_back(i);
else id[++cnt]=i;
}
for(int i=1;i<=cnt;i++){
for(int j=0;j<=n;j++){
dp[i][j]=dp[i-1][j];//继承
if(j>=v[id[i]])dp[i][j]=max(dp[i][j],dp[i-1][j-v[id[i]]]+p[id[i]]*v[id[i]]);//转移
if(e[id[i]].size()==1){
int vv=v[id[i]]+v[e[id[i]][0]];//主+附件1
int ww=p[id[i]]*v[id[i]]+p[e[id[i]][0]]*v[e[id[i]][0]];
if(j>=vv)dp[i][j]=max(dp[i][j],dp[i-1][j-vv]+ww);
}
if(e[id[i]].size()==2){
int vv=v[id[i]]+v[e[id[i]][1]];//主+附件2
int ww=p[id[i]]*v[id[i]]+p[e[id[i]][1]]*v[e[id[i]][1]];
if(j>=vv)dp[i][j]=max(dp[i][j],dp[i-1][j-vv]+ww);
vv+=v[e[id[i]][0]];//主+附件1,2
ww+=p[e[id[i]][0]]*v[e[id[i]][0]];
if(j>=vv)dp[i][j]=max(dp[i][j],dp[i-1][j-vv]+ww);
}
}
}
for(int i=0;i<=n;i++)ans=max(ans,dp[cnt][i]);
cout<<ans<<endl;
return 0;
}
/*
*/
in
2000 10
500 1 0
400 4 0
300 5 1
400 5 1
200 5 0
500 4 5
400 4 0
320 2 0
410 3 0
400 3 5
out
7400
ans
7430