51Nod 1007 正整數分組 遞推 DP

題目鏈接

思路:

問題是:將所有的正整數分爲兩組,使得兩組的差最小。

再將問題轉化一下。在使用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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章