石子归并

石子归并

Description

有一堆石头质量分别为W1,W2,…,Wn.(Wi≤10000),将石头合并为两堆,使两堆质量的差最小。

Input

输入第一行只有一个整数n(1≤n≤50),表示有n堆石子。接下去的n行,为每堆石子质量。

Output

输出只有一行,该行只有一个整数,表示最小的质量差.

Sample Input

5 
5
8
13
27
14

Sample Output

3

HINT

Source

#include<bits/stdc++.h>
using namespace std;
bool f[500001];
int n,a[51];
int abbs(int x,int y)
{
    if(x-y>0)return x-y;
    else return y-x;
}
int main()
{
    cin>>n;
    int sum=0;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        sum+=a[i];
    }
    memset(f,0,sizeof(f));
    f[0]=1;
    for(int i=1;i<=n;i++)
    {
        for(int j=sum;j>=0;j--)
        if(f[j]==1)
        {
            f[j+a[i]]=1;
        }
    }
    int ans=sum;
    for(int i=0;i<=sum;i++)
    if(f[i]==1)
    {
        if(ans>abbs(i,sum-i))
        {
            ans=abbs(i,sum-i);
        }
    }
    cout<<ans<<endl;
    return 0;
}
/**************************************************************
    Problem: 1605
    User: LJA001162
    Language: C++
    Result: 正确
    Time:24 ms
    Memory:2024 kb
****************************************************************/
posted @ 2019-11-15 16:45  牛大了的牛大  阅读(313)  评论(0编辑  收藏  举报