90分求助!

P1455 搭配购买

@[zfznbnb](/user/608251) ```cpp #include<bits/stdc++.h> using namespace std; int n,m,w,c[10001],v[10001],a,b,f[10001],dp[10001]; int find(int a){ if(f[a]==a)return a; return f[a]=find(f[a]); } int main(){ cin>>n>>m>>w; for(int i=1;i<=n;i++)f[i]=i; for(int i=1;i<=n;i++){ cin>>c[i]>>v[i]; } for(int i=1;i<=m;i++){ cin>>a>>b; f[find(a)]=find(b); } //for(int i=1;i<=n;i++)cout<<c[i]<<" "<<v[i]<<" "; for(int i=1;i<=n;i++) { if(f[i]!=i) { c[find(i)]+=c[i]; c[i]=0; v[find(i)]+=v[i]; v[i]=0; } } // for(int i=1;i<=n;i++)cout<<c[i]<<" "<<v[i]<<" "<<endl; for(int i=1;i<=n;i++){ for(int j=w;j>=0;j--){ if(c[i]<=j) dp[j]=max(dp[j],dp[j-c[i]]+v[i]); } } cout<<dp[w]; return 0; } ``` 已改好,原因是最后01背包不应写 $c_{find(i)}$,而是应该写 $c_{i}$,因为前面累加的时候已经以祖先累加了。
by Nwayy @ 2022-12-04 07:08:42


@[winds888](/user/664744) 明白了,谢谢
by zfznbnb @ 2022-12-07 20:46:12


|