1 条题解

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

    C :

    #include "stdio.h"
    int n,s;
    int a[50],f[50001];
    int main()
    {
    	int i,j;
    	scanf("%d",&n);
    	s=0;
    	for(i=0;i<n;i++)
    	{
    		scanf("%d",&a[i]);
    		s+=a[i];
    	}
    	if(s%2)
    		printf("0\n");
    	else
    	{
    		f[0]=1;
    		s/=2;
    		for(i=0;i<n;i++)
    		{
    			for(j=s;j>=a[i];j--)
    				if(f[j-a[i]])
    					f[j]+=f[j-a[i]];
    		}
    		printf("%d\n",f[s]/2);
    	}
    	return 0;
    }
    

    C++ :

    #include<iostream>  
    #include<cstdio>  
    #include<cstring>  
    using namespace std;  
    int dp[51][3010], p[55];  
    int main()  
    {  
    //  freopen("a.txt","r",stdin);  
        int n, i, j, k;  
        while(cin >> n)  
        {  
            memset(dp,0,sizeof(dp));  
            int sum(0);  
            for(i = 1; i <= n; ++ i)  
            {  
                cin >> p[i];  
                sum += p[i];  
            }  
            if(sum % 2) { cout << '0' << endl; continue; }  
            dp[0][0] = 1;  
            for(i = 1; i <= n; ++ i)  
            {  
                for(j = 0; j <= sum/2; ++ j)  
                {  
                    dp[i][j] = dp[i-1][j];  
                    if(j - p[i] >= 0)  
                         dp[i][j] = dp[i][j] + dp[i-1][j-p[i]];  
                }  
            }  
            cout << dp[n][sum/2]/2 << endl;  
        }  
        return 0;  
    }  
    

    Pascal :

    {$N+}
    const
      ipf = 'compete.in';
      opf = 'compete.out';
    var
      a       : array[0..2500]of extended;
      c       : array[1..50]of byte;
      i,j,k,n : word;
      s       : longint;
    
    begin
      {assign(input,ipf); reset(input);
      assign(output,opf); rewrite(output);}
      repeat
        readln(n);
        if n = 0 then break;
        s := 0;
        for i := 1 to n do begin
          read(c[i]); s := s+c[i];
        end;
        readln;
        if odd(s) then writeln(0)
        else begin
          fillchar(a,sizeof(a),0);
          a[0] := 1;
          for i := 1 to n do
            for j := s div 2-c[i] downto 0 do a[j+c[i]] := a[j+c[i]]+a[j];
          writeln(a[s div 2]/2:0:0);
        end;
      until false;
      {close(input); close(output);}
    end.
    
    • 1

    信息

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