落谷P1455
作者:互联网
#include <bits/stdc++.h>
using namespace std;
int dad[10001];
int find_dad(int x){
if(dad[x]!=x){
return find_dad(dad[x]);
}else{
return x;
}
}
int main(){
int n,m,w;//n:云朵数、m:搭配数、w:钱数
cin>>n>>m>>w;
int dp[w+1];
int prize[n+1];
int worse[n+1];
for(int i=0;i<=n;i++){
dad[i]=i;
}
for(int i=0;i<=w;i++){
dp[i]=0;
}
for(int i=1;i<=n;i++){
cin>>prize[i]>>worse[i];
}
for(int i=1;i<=m;i++){//并查集找是否相连
int x,y;
cin>>x>>y;
if(find_dad(x)!=find_dad(y)){
dad[find_dad(y)]=find_dad(x);
}
}
for(int i=1;i<=n;i++){
if(dad[i]!=i){
prize[find_dad(i)]+=prize[i];
worse[find_dad(i)]+=worse[i];
prize[i]=w+1;
worse[i]=0;
}
}
for(int i=1;i<=n;i++){//背包算法,把一种搭配看作一件商品。
if(prize[i]>w){
continue;
}
for(int j=w;j>=prize[i];j--){
dp[j]=max(dp[j],dp[j-prize[i]]+worse[i]);
}
}
cout<<dp[w];
return 0;
}
题目链接:搭配购买 - 洛谷
标签:P1455,dad,落谷,prize,int,find,dp,worse 来源: https://blog.csdn.net/wyq1010/article/details/121587286