南阳325--zb的生日

zb的生日

时间限制: 3000 ms  |  内存限制:65535 KB
难度: 2
 
描述
今天是阴历七月初五,acm队员zb的生日。zb正在和C小加、never在武汉集训。他想给这两位兄弟买点什么庆祝生日,经过调查,zb发现C小加和never都很喜欢吃西瓜,而且一吃就是一堆的那种,zb立刻下定决心买了一堆西瓜。当他准备把西瓜送给C小加和never的时候,遇到了一个难题,never和C小加不在一块住,只能把西瓜分成两堆给他们,为了对每个人都公平,他想让两堆的重量之差最小。每个西瓜的重量已知,你能帮帮他么?
 
输入
多组测试数据(<=1500)。数据以EOF结尾
第一行输入西瓜数量N (1 ≤ N ≤ 20)
第二行有N个数,W1, …, Wn (1 ≤ Wi ≤ 10000)分别代表每个西瓜的重量
输出
输出分成两堆后的质量差
样例输入
5

5 8 13 27 14
样例输出
3
来源
ural
上传者
李文鑫
//dp:
 1 #include <stdio.h>

 2 #include <string.h>

 3 #include <algorithm>

 4 #define max(a,b) a>b?a:b 

 5 using namespace std ;

 6 int main()

 7 {

 8     int num[25] ;

 9     int dp[100005] ;

10     int i, j, n ;

11     while(~scanf("%d", &n))

12     {

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

14         int sum = 0 ;

15         for(i=0; i<n; i++)

16         {

17             scanf("%d",&num[i]) ;

18             sum += num[i] ;

19         }

20         for(i=0; i<n; i++)

21         {

22             for(j = sum/2; j >= num[i]; j--)

23             {

24                 dp[j] = max(dp[j], dp[j-num[i]]+num[i]) ;

25             }

26         }

27         printf("%d\n", sum - 2*dp[sum/2]) ;

28     }

29     return 0 ;

30 }

 

//搜索真难懂,摘自讨论区:

南阳325--zb的生日
 1 #include <iostream>

 2 #include <string>

 3 #include <stdio.h>

 4 #include <algorithm>

 5 #include <stdlib.h>

 6 using namespace std;

 7 

 8 const int WATER_MELON = 25;

 9 const int MAX_WEIGHT = 10005;

10 

11 int n;//西瓜个数

12 int sum;

13 int w[WATER_MELON];

14 int result;

15 

16 bool HandleEachCase();

17 

18 int main()

19 {

20     while(HandleEachCase())

21     {

22         //empty while

23     }

24 }

25 

26 void dfs(int iStep, int iSum);

27 

28 bool HandleEachCase()

29 {

30     if(!(cin>>n))

31     return false;

32     sum = 0;

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

34     {

35         cin>>w[i];

36         sum+=w[i];

37     }

38     result = sum;

39     dfs(0, 0);

40     cout<<result<<endl;

41     return true;

42 }

43 

44 void dfs(int iStep, int iSum)

45 {

46     if(iSum >= (sum>>1) && abs(sum - (iSum<<1))>= result)  //比当前最优解要差    

47     return;

48     if(iStep == n)

49     {//当前的最优解

50 /*result = abs(sum - (iSum<<1));*/

51         if(abs(sum-(iSum<<1))< result)    

52         result = abs(sum-(iSum<<1));

53         return;

54     }

55     dfs(iStep+1, iSum+w[iStep]);

56     dfs(iStep+1, iSum);

57 } 
View Code

 

 

 

你可能感兴趣的:(B)