思路:
問題是:將所有的正整數分爲兩組,使得兩組的差最小。
再將問題轉化一下。在使用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;
}