uva 10032 Problem F: Tug of War

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=973

 1 #include <cstdio>

 2 #include <cstring>

 3 #include <algorithm>

 4 #define ll long long

 5 using namespace std;

 6 

 7 int w[5000];

 8 int n;

 9 ll dp[50000];

10 

11 int main()

12 {

13     int t;

14     scanf("%d",&t);

15     while(t--)

16     {

17         scanf("%d",&n);

18         int sum=0;

19         for(int i=0; i<n; i++)

20         {

21             scanf("%d",&w[i]);

22             sum+=w[i];

23         }

24         memset(dp,0,sizeof(dp));

25         dp[0]=1;

26         for(int i=0; i<n; i++)

27         {

28             for(int j=sum; j>=w[i]; j--)

29             {

30                 dp[j] |= dp[j-w[i]]<<1;

31             }

32         }

33         int ans1=0,ans2=0x3f3f3f3f;

34         for(int i=0; i<=sum; i++)

35         {

36             for(int j=0; j<=(n+1)/2; j++)

37             {

38                 if(dp[i]&(1ll<<j) && abs(2*j-n)<=1)

39                 {

40                     if(abs(sum-2*i)<ans2-ans1)

41                     {

42                         ans2=max(sum-i,i);

43                         ans1=min(sum-i,i);

44                     }

45                 }

46             }

47         }

48         printf("%d %d\n",ans1,ans2);

49         if(t) printf("\n");

50     }

51     return 0;

52 }
View Code

 

你可能感兴趣的:(uva)