1. 程式人生 > >NYOJ 456 郵票分你一半

NYOJ 456 郵票分你一半

    郵票分你一半
時間限制:1000 ms  |  記憶體限制:65535 KB
難度:3

描述
         小珂最近收集了些郵票,他想把其中的一些給他的好朋友小明。每張郵票上都有分值,他們想把這些郵票分成兩份,並且使這兩份郵票的分值和相差最小(就是小珂得到的郵票分值和與小明的差值最小),現在每張郵票的分值已經知道了,他們已經分好了,你知道最後他們得到的郵票分值和相差多少嗎?

輸入
    第一行只有一個整數m(m<=1000),表示測試資料組數。
    接下來有一個整數n(n<=1000),表示郵票的張數。
    然後有n個整數Vi(Vi<=100),表示第i張郵票的分值。
輸出
    輸出差值,每組輸出佔一行。
樣例輸入

    2
    5
    2 6 5 8 9
    3
    2 1 5

樣例輸出

    0
    2


	#include<stdio.h>  
    #include<string.h>  
    int main()  
    {  
        int i,j,k,l,n,m,a[100005],b[100005];  
        scanf("%d",&m);  
        while(m--)  
        {  
            scanf("%d",&n);  
            memset(b,0,sizeof(b));  
            memset(a,0,sizeof(a));  
            int sum=0;  
            for(i=1;i<=n;i++)  
                {  
                    scanf("%d",&a[i]);  
                    sum+=a[i];  
                }  
            for(i=1;i<=n;i++)  
            {
			  for(j=sum/2;j>=a[i];j--)  
            { 
               if(b[j]<=b[j-a[i]]+a[i])  
                 b[j]=b[j-a[i]]+a[i];  
            }
            }  
            printf("%d\n",sum-2*b[sum/2]);  
              
        }return 0;  
    }  
思路詳解:先把郵票的總分數平分,得出sum/2;用來儲存郵票的各種最小相加接近於平分數的最優解,即儲存的總和數不能大於b陣列的下標,最後一個階段的b的最大下標的
值即為最接近平分數的值