思路:
问题是:将所有的正整数分为两组,使得两组的差最小。
再将问题转化一下。在使用n个数,分为两组的的所有情况下的差的最小值。dp[i][j]代表用了前i个数,j这个差有没有出现过。
那么n个数分为两组的差的全部情况可以有num[n]和dp[n-1][0-maxn]推出。
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e4+10;
int dp[102][MAXN];
int inf = 0x3fffffff;
int main()
{
int num,n;
cin>>n;
cin>>num;
dp[0][num] = 1;
for ( int i=1; i<n; i++ ) {
scanf("%d",&num);
for ( int j=0; j<MAXN; j++ ){
if ( dp[i-1][j] ) {
int t1 = j+num;
int t2 = abs(j-num);
dp[i][t1] = dp[i][t2] = 1;
}
}
}
int ans = inf;
for ( int i=0; i<MAXN; i++ )
ans = min( ans,dp[n-1][i]==1?i:inf ) ;
cout<<ans<<endl;
return 0;
}