【動態規劃】數字分組I

【動態規劃】數字分組I

時間限制: 1 Sec  內存限制: 64 MB
提交: 10  解決: 6
[提交][狀態][討論版]

題目描述

給出一堆魔法石的重量,問如何分成兩堆,使得它們質量和之差最小,求出這個最小值。

輸入

第一行一個數n (n ≤30)。 接下來n行,每行一個正整數。(每個數≤100000)

輸出

 一個整數表示兩組數字和的最小差。

樣例輸入

5
1 2 3 4 5

樣例輸出

1

將問題轉化爲求揹包容量爲所有數總和一半的揹包問題
#include <iostream>
#include <cstring>

using namespace std;
int f[1555555]={0},sum,n;
int a[33];
int main()
{
    cin>>n;
    sum=0;
    memset(f,0,sizeof(f));
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
        sum+=a[i];
    }
    for(int i=0;i<n;i++)
    {
        for(int j=sum/2;j>=a[i];j--)
        {
            f[j]=max(f[j],f[j-a[i]]+a[i]);
        }

    }
    cout<<sum-2*f[sum/2]<<endl;
    return 0;
}
View Code

 

 
posted on 2016-08-11 20:15 asuml 閱讀(...) 評論(...) 編輯 收藏
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章