//这道题是最基本的组合问题
//zuhe[i]数值的0值代表 a[i] 左部分 1值代表 右部分 每次计算完毕 对组合更新
#include
#include
#include
int main()
{
int zuhe[21],a[21],suma,sumb,min,n,i;
//接收
while(scanf("%d",&n),n>0)
{
min=20*500000;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
//重置组合值为0
memset(zuhe,0,sizeof(zuhe));
//当组合未全部迭代过
while(zuhe[0]==0)
{
//根据组合值计算俩部分的 差值
suma=0;
sumb=0;
for(i=1;i<=n;i++)
{
if(zuhe[i]==0)
{
suma+=a[i];
}
else
{
sumb+=a[i];
}
if(min>abs(sumb-suma))
{
min=abs(sumb-suma);
}
}
//计算完毕后更新zuhe值
zuhe[n]++;
i=n;
while(zuhe[i]==2)
{
zuhe[i]=0;
zuhe[i-1]++;
i--;
}
}
//输出min
printf("%d\n", min);
}
return 0;
}
我测试了下 应该没问题了 输入小于0 结束
关于这类 类型 可以去看看排列组合的