正整数分组(动态规划,但我用的是枚举)

个人心得:这题其实是一个运用动态规划的题目,将n个整数放在俩个背包里,平均下来就是sum/2,此时找到放在背包中最大的就可以了,

此时相减必然是最小的差。而我根据动态规划一步一步得到最优解的思想,从第一个开始枚举,到第n个数会有2^n个数据太大了,n可取100,

听说n=32,就能买下整个拉斯维加斯了。所以我用了stack和set就排重,本来以为会超时,但没想到过了。

题目:

将一堆正整数分为2组,要求2组的和相差最小。
例如:1 2 3 4 5,将1 2 4分为1组,3 5分为1组,两组和相差1,是所有方案中相差最少的。
 
Input
第1行:一个数N,N为正整数的数量。
第2 - N+1行,N个正整数。
(N <= 100, 所有正整数的和 <= 10000)
Output
输出这个最小差
Input示例
5
1
2
3
4
5
Output示例
1
 1 #include<iostream>
 2 #include<cstring>
 3 #include<string>
 4 #include<cstdio>
 5 #include<vector>
 6 #include<cmath>
 7 #include<stack>
 8 #include<set>
 9 #include<queue>
10 #include<algorithm>
11 using namespace std;
12 #define in 1000000005
13 int main()
14 {
15     int n,number[105];
16     cin>>n;
17     for(int i=0;i<n;i++)
18        cin>>number[i];
19        stack<int >pq;
20        set<int >s;
21        if(n==1)
22     {
23         cout<<number[0]<<endl;
24     }
25     else
26     {
27         int x=fabs(number[0]-number[1]);
28         int y=number[0]+number[1];
29         s.insert(x),s.insert(y);
30         set<int >::iterator  it;
31         for(int i=2;i<n;i++)
32         {
33             for(it=s.begin();it!=s.end();it++)
34             {
35                 pq.push(*it);
36             }
37             s.clear();
38             while(!pq.empty())
39             {
40                 int t=pq.top();
41                 pq.pop();
42                 s.insert(t+number[i]);
43                 s.insert(fabs(t-number[i]));
44             }
45         }
46        int mina=in;
47        for(it=s.begin();it!=s.end();it++)
48            if(mina>*it)  mina=*it;
49        s.clear();
50        cout<<mina<<endl;
51 
52     }
53     return 0;
54 }

 

posted @ 2017-09-23 11:50  余生漫漫浪  阅读(752)  评论(0编辑  收藏  举报