1. 程式人生 > >正整數分組(動態規劃)

正整數分組(動態規劃)

容量 line 我們 gpo spa name sum log body

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1007

先把數據分成兩組,那麽必定有一組趨近於所有數的和/2

我們可以把數的和看成包的重量,每個數看成要放入包的物體,這樣就能把問題當作01背包處理,找到小於sum/2的最大放入量即可

dp[i][j]代表放入到第i個物體時背包容量為j時數的和,那麽dp[i][j]大小由前一個物體放或不放決定

可以得到dp[i][j] = max(dp[i - 1][j], dp[i - 1][j-a[i]] + a[i])

最後得到dp[n][sum/2]表示較小的那一組數之和,那麽兩組數和之差就是(sum - dp[n][sum/2])-dp[n][sum / 2]

#include<iostream>
#include<algorithm>
using namespace std;

int a[10005], dp[105][10005] = {0},sum=0;
int main()
{
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        sum += a[i];
    }

    for (int i = 1; i <= n; i++)
        for(int
j=sum/2;j>=a[i];j--) dp[i][j] = max(dp[i - 1][j], dp[i - 1][j-a[i]] + a[i]); cout << (sum - dp[n][sum/2])-dp[n][sum / 2]; return 0; }

正整數分組(動態規劃)