uva 562

01揹包問題,列舉所有的分配可能,然後求兩人錢相差最少的值。

 

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 105;
const int maxm = 50005;
bool dp[maxm];
int cent[maxn];
int main()
{
    int cas;
    scanf("%d",&cas);
    while(cas--){
        int m,sum=0;
        scanf("%d",&m);
        for(int i=0; i<m; ++i){
           scanf("%d",¢[i]);
           sum += cent[i];
        }
        memset(dp,false,sizeof(dp));
        dp[0] = true;
        for(int i=0; i<m; ++i)
        for(int j=sum; j>=0; --j)
            if(dp[j])
               dp[j+cent[i]] = true;
        for(int i=sum/2; i>=0; --i)
             if(dp[i]){
               printf("%d\n",sum-2*i);
               break;
             }
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章