南阳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
", sum - 2*dp[sum/2]) ;
28     }
29     return 0 ;
30 }

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

 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
原文地址:https://www.cnblogs.com/soTired/p/4671531.html