搭配购买

超水的并查集加背包,我居然卡了几次,最后是傻逼的多套了层循环,,

调试的时候一定要专注,不然不可能找到错误,

确保程序能运行再去追求结果,你的目的是做对这个算法题,不是来秀你不熟的运算符重载,

题目

#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]);
}

 

posted @ 2017-02-15 22:31  rsqppp  阅读(173)  评论(0)    收藏  举报