正整数分组(动态规划,但我用的是枚举)
个人心得:这题其实是一个运用动态规划的题目,将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 }