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
Ultraviolet A 10032 problem F: tug of war