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 }