Description
你有一堆石头质量分别为W1,W2,W3…WN.(W<=100000)现在需要你将石头合并为两堆,使两堆质量的差为最小。
Input
测试数据第一行为整数N(1<=N<=20),表示有N堆石子。第二行为N个数,为每堆石子的质量。
Output
每组测试数据只需输出合并后两堆的质量差的最小值。
Sample Input
5
5 8 13 27 14
Sample Output
3
思路:
深搜,把所有的可能试一遍,然后求出质量差的最小值。
#include<iostream>
#include<cstdio>
using namespace std;
int n,m,t,a[505];
void dfs(int k,int l,int r)//k表示还剩下多少个石子,l表示第一堆的质量,r表示第二堆的质量。
{
if(k==0)//判断是否还有未归并的石子
{
if(max(l,r)-min(l,r)<m)//判断此次方案的质量差是否小于原纪录最小的差
m=max(l,r)-min(l,r);
}
else//如果还有石子,继续归并
{
dfs(k-1,l+a[k],r);//归并到第一堆里
dfs(k-1,l,r+a[k]);//归并到第二堆里
}
}
int main()
{
m=2147483647;//不要问为什么赋值那么大
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
dfs(n,0,0);
printf("%d",m);
return 0;
}