搭配购买
超水的并查集加背包,我居然卡了几次,最后是傻逼的多套了层循环,,
调试的时候一定要专注,不然不可能找到错误,
确保程序能运行再去追求结果,你的目的是做对这个算法题,不是来秀你不熟的运算符重载,
#include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<algorithm> using namespace std; const int maxn = 10010; struct Node { int cost,value; Node operator + (const Node& b)const{ Node c; c.cost = cost+b.cost; c.value = value+b.value; return c; } }N[maxn]; int p[maxn]; int dp[maxn]; vector<Node> k; int find(int x); int n,m,w; int main() { scanf("%d%d%d",&n,&m,&w); for(int i = 1;i <= n;i++) { int c,d; scanf("%d%d",&c,&d); N[i].cost = c;N[i].value = d; } for(int i = 0;i <=n;i++) p[i] = i; for(int i = 0;i < m;i++) { int u,v; scanf("%d%d",&u,&v); int x = find(u); int y = find(v); if(x != y) { N[y] = N[y]+N[x]; p[x] = y; } } for(int i = 1;i<=n;i++) { if(p[i] == i) { k.push_back(N[i]); } } for(int i = 0;i < k.size();i++) { for(int j = w;j >= k[i].cost;j--){ dp[j] = max(dp[j],dp[j-k[i].cost]+k[i].value); } } printf("%d\n",dp[w]); return 0; } int find(int x) { if(p[x]==x)return x; return find(p[x]); }

浙公网安备 33010602011771号