题目
你有一堆石头质量分别为W1,W2,W3…WN.(W<=100000)现在需要你将石头合并为两堆,使两堆质量的差为最小。
输入格式
测试数据第一行为整数N(1<=N<=20),表示有N堆石子。第二行为N个数,为每堆石子的质量。
输出格式
每组测试数据只需输出合并后两堆的质量差的最小值。
思路
一个数一个数搜,选择放第一堆(a堆)还是第二堆(b堆)。计算一下差值。
程序
#include<cstdio>
using namespace std;
int k[21],a,b,n,c=1000000;
int cha(int i,int j){ //输出差值的字程序
if(i>j) return i-j;
else return j-i;
}
void cc(int d){
if(d>n){ //所有都放完了
if(cha(a,b)<c) c=cha(a,b);
return;
}
a+=k[d]; //放a里
cc(d+1);
a-=k[d];
b+=k[d]; //放b里
cc(d+1);
b-=k[d];
return;
}
int main(){
scanf("%d",&n); //输入
for(int i=1;i<=n;i++)
scanf("%d",&k[i]);
cc(1);
printf("%d",c); //输出
return 0;
}