1 条题解

  • 0
    @ 2024-12-24 10:06:03

    C :

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int f[10010];
    int ff[10010][2];
    int hash[10010];
    int info[10010][2];
    int dp[10010];
    int cnt;
    int n, m, w;
    
    int find(int v){
    if(f[v] == v)return v;
    int F = find(f[v]);
    f[v] = F;
    return F;
    }
    
    int main()
    {
        while(scanf("%d%d%d",&n,&m,&w) != EOF){
            for(int i = 1;i <= n; i++){
                scanf("%d%d",&ff[i][0],&ff[i][1]);
            }
            for(int i = 0;i <= n; i++)f[i]=i;
            memset(hash,0,sizeof(hash));
            memset(info,0,sizeof(info));
            memset(dp,0,sizeof(dp));
            cnt = 0;
            for(int i = 0;i < m; i++){
                int a, b;
                scanf("%d%d",&a,&b);
                int fa = find(a);
                int fb = find(b);
                if(fa != fb)f[fa] = fb;
            }
            for(int i = 1;i <= n; i++)f[i] = find(i);
            for(int i = 1;i <= n; i++){
                if(hash[f[i]]==0){
                    hash[f[i]] = ++cnt;
                }
                info[hash[f[i]]][0] += ff[i][0];
                info[hash[f[i]]][1] += ff[i][1];
            }
            for(int i = 1;i <= cnt; i++){
                for(int j = w;j >= info[i][0];j--){
                    if(dp[j] < dp[j - info[i][0]] + info[i][1]){
                        dp[j] = dp[j - info[i][0]] + info[i][1];
                    }
                }
            }
            int ans = 0;
            for(int i = 1;i <= w; i++){
                if(ans < dp[i])ans = dp[i];
            }
            printf("%d\n",ans);
        }
        return 0;
    }
    

    C++ :

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    struct buy
    {
    	int jg,jz;
    };
    int n,m,w,len=0;
    int f[10001],b[10001];
    buy a[10010],c[10010];
    void init();
    int find(int);
    void bag();
    int main()
    {
    	//freopen("buy4.in","r",stdin);
    	init();
    	bag();
    	return 0;
    }
    void init()
    {
    	cin>>n>>m>>w;
    	for(int i=1;i<=n;i++) f[i]=i;
    	for(int i=1;i<=n;i++) cin>>a[i].jg>>a[i].jz;
    	int x,y,fx,fy;
    	for(int i=1;i<=m;i++)
    	{
    		cin>>x>>y;
    		fx=find(x);
    		fy=find(y);
    		if(fy!=fx)
    		{
    			a[fx].jg+=a[fy].jg;
    			a[fx].jz+=a[fy].jz;
    			f[fy]=fx;	
    		}
    		
    		//if(x!=fx) a[x].jg=0x7fffffff;
    		//if(y!=fy) a[y].jg=0x7fffffff;
    	}
    	for(int i=1;i<=n;i++)
    	{
    		if(f[i]==i)
    		{
    			len++;
    			c[len]=a[i];
    			//cout<<c[len].jz<<' '<<c[len].jg<<endl;
    		}
    	}
    }
    void bag()
    {
    	for(int i=1;i<=len;i++)
    	{
    		for(int j=w;j>=c[i].jg;j--)
    		{
    			if(c[i].jg<=w)
    			{
    				if(b[j]<b[j-c[i].jg]+c[i].jz)
    				b[j]=b[j-c[i].jg]+c[i].jz;
    			}
    		}
    	}
    	cout<<b[w]<<endl;
    }
    int find(int x)
    {
    	if(f[x]==x) return x;
    	f[x]=find(f[x]);
    	return f[x];
    }
    
    • 1

    信息

    ID
    1835
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者