1 条题解

  • 0
    @ 2025-2-14 21:20:39

    C :

    #include<stdio.h>
    #include<string.h>
    
    int n,sum,dp[55][45010];
    
    int abs(int x)
    {
    	return x>0?x:-x;
    }
    
    void add(int x)
    {
    	int i,j;
    	for(i=n/2-1;i>=0;i--)
    	{
    		for(j=0;j<=sum;j++)
    		{
    			if(dp[i][j])
    			{
    				if(j+x<45010)
    					dp[i+1][j+x]=1;
    			}
    		}
    	}
    }
     
    int main()
    {
    	int i,a,ans;
    	while(scanf("%d",&n)!=EOF)
    	{
    		sum=0;
    		memset(dp,0,sizeof(dp));
    		dp[0][0]=1;
    		for(i=0;i<n;i++)
    		{
    			scanf("%d",&a);
    			sum+=a;
    			add(a);
            }
    		ans=sum;
    		for(i=0;i<=sum;i++)
    		{
    			if(dp[n/2][i])
    			{
    				if(abs(sum-i-i)<ans)
    					ans=abs(sum-i-i);
    			}
    		}
    		printf("%d %d\n",(sum-ans)/2,(sum-ans)/2+ans);
    	}
    	return 0;
    }
    

    C++ :

    #include<stdio.h>
    #include<string.h>
    
    int n,sum,dp[55][45010];
    
    int abs(int x)
    {
    	return x>0?x:-x;
    }
    
    void add(int x)
    {
    	int i,j;
    	for(i=n/2-1;i>=0;i--)
    	{
    		for(j=0;j<=sum;j++)
    		{
    			if(dp[i][j])
    			{
    				if(j+x<45010)
    					dp[i+1][j+x]=1;
    			}
    		}
    	}
    }
     
    int main()
    {
    	int i,a,ans;
    	while(scanf("%d",&n)!=EOF)
    	{
    		sum=0;
    		memset(dp,0,sizeof(dp));
    		dp[0][0]=1;
    		for(i=0;i<n;i++)
    		{
    			scanf("%d",&a);
    			sum+=a;
    			add(a);
            }
    		ans=sum;
    		for(i=0;i<=sum;i++)
    		{
    			if(dp[n/2][i])
    			{
    				if(abs(sum-i-i)<ans)
    					ans=abs(sum-i-i);
    			}
    		}
    		printf("%d %d\n",(sum-ans)/2,(sum-ans)/2+ans);
    	}
    	return 0;
    }
    

    Java :

    import java.util.Scanner;
    
    
    public class Main {
    	public static void main(String[] args) {
    		Scanner in = new Scanner(System.in);
    		while (in.hasNextInt()) {
    			int n = in.nextInt();
    			int[] w = new int[n + 1];
    			int sum = 0;
    			for (int i = 1; i <= n; i++) {
    				w[i] = in.nextInt();
    				sum += w[i];
    			}
    			int ave = sum / 2;
    			int[] f = new int[ave + 1];
    			for (int i = 1; i <= n; i++) {
    				for (int j = ave; j >= w[i]; j--) {
    					f[j] = Math.max(f[j], f[j - w[i]] + w[i]);
    				}
    			}
    			int t1 = f[ave];
    			int t2 = sum - f[ave];
    			if (t1 <= t2)
    				System.out.println(t1 + " " + t2);
    			else
    				System.out.println(t2 + " " + t1);
    		}
    	}
    }
    
    
    • 1

    信息

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