石子归并
石子归并
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
****************************************************************/