c语言西瓜问题

地面上有12个西瓜,它们的重量(单位为“两”,为计算方便已全部转化为整数,如98即为9斤8两)如下: 98,93,57,64,50,82,18,34,69,56,16,61 设计程序:实现对以上12个瓜“二堆均分”(每堆6个,两堆重量相等),要求打印输出均分的各种可能方案;

其实想法相对好理解 就是12个数中任意选取其中6个数相加等于总和的一半,然后筛选出来,难点是如何穷举组合。
我大概写了个:(结果得到6组,实际上第一堆和第二堆位置颠倒,本质只有3组,可以看下)
#include <stdio.h>
#include <stdlib.h>
void zuhe(int a[],int n,int m,int s)//从n个元素的数组a中,取m个元素的组合
{
int index,i,j,x=0,p[6],q[6];
int s2,l=1;
int item1[6],item2[6];
index=0;
p[index]=0;
while(1)
{
if(p[index]>=n)
{
if(index==0)
{
break;
}
index--;
p[index]++;
}
else if(index==m-1)//满足12选6组合
{
s2=0;
x=0;
for(i=0;i<m;i++)s2+=a[p[i]];
if(s2==s)//满足平分,得出第一堆p[6]
{
for(i=0;i<12;i++)
{
for(j=0;j<m;j++)
if(i==p[j])break;
if(j==m)q[x++]=i;//筛选第二堆q[6]
}
printf("%d.",l);
printf("第一堆:");
for(i=0;i<m;i++)printf("%3d",a[p[i]]);
printf(" ");
printf("第二堆:");
for(i=0;i<x;i++)printf("%3d",a[q[i]]);
printf("\n");
l++;
}
p[index]++;
}
else
{
index++;
p[index]=p[index-1]+1;
}
}
}
main()
{
int i,s=0;
int items[12]={98,93,57,64,50,82,18,34,69,56,16,61};
for(i=0;i<12;i++)s+=items[i];
s/=2;//算出平分值
zuhe(items,12,6,s);
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-04-03
#include<stdio.h>
int main()
{
int a[12]={98,93,57,64,50,82,18,34,69,56,16,61},sum = 0,b,c,d,e,f,g,i;
for(i = 0; i < 12; i++)
sum = sum + a[i];
for(b = 0; b < 6; b++)
{
for(c = b + 1; c < 7; c++)
{
for(d = c + 1; d < 8; d++)
{
for(e = d + 1; e < 9; e++)
{
for(f = e + 1; f < 10; f++)
{
for(g = f + 1; g < 11; g++)
{
if(a[b] + a[c] + a[d] + a[e] + a[f] + a[g] == sum/2)
{
printf("%d %d %d %d %d %d\n",a[b],a[c],a[d],a[e],a[f],a[g]);
for(i = 0; i < 12; i++)
{
if(i != b && i != c && i != d && i != e && i != f && i != g)
printf("%d ",a[i]);
}
printf("\n\n");
}
}
}
}
}
}
}
return 0;
}本回答被网友采纳
相似回答