分西瓜(dfs)

描述

今年暑假计算机学院带领大二的计算机专业学生实习,在实习过程中计科一班和计科二班表现突出,辅导员决定买一堆西瓜奖励这两个班,为了对每个班公平,她想让两堆的重量之差最小。每个西瓜的重量已知,你能帮帮她么?

输入:

第一行输入西瓜数量N (1 ≤ N ≤ 20)

第二行有N个数,W1, …, Wn (1 ≤ Wi ≤ 10000)分别代表每个西瓜的重量

输出:

输出分成两堆后的最小质量差

样例输入:

5

5 8 13 27 14

样例输出:

3

 1 //深度优先搜索
 2 #include <iostream>
 3 #include <string.h>
 4 #include <cmath>
 5 using namespace std;
 6 int allmax=0,a[100];
 7 int allsum=0;
 8 void dfs(int sum,int i)
 9 {
10     if(i<0)
11         return ;
12     int max;
13     if(allsum>2*sum)
14         max=allsum-2*sum;
15     else
16         max=2*sum-allsum;
17     if(allmax>max)
18         allmax=max;
19     dfs(sum+a[i],i-1);
20     dfs(sum,i-1);
21 }
22 int main()
23 {
24     int n;
25     while(cin>>n)
26     {
27         int i;
28         memset(a,0,sizeof(a));
29         allmax=9999999;
30         for(i=0; i<n; i++)
31         {
32             cin>>a[i];
33             allsum=allsum+a[i];
34         }
35         dfs(0,n-1);
36         cout<<allmax<<endl;
37         allsum=0;
38     }
39     return 0;
40 }

原文地址:https://www.cnblogs.com/geziyu/p/9233219.html