您的位置:首页 > 其它

关于任一数组的组合问题

2009-03-24 20:25 288 查看
任意给一数组,如{-10,45,35,99,10,6,9,20,17,18}
再任意给一个值,如35.
请从上面的数组中找出所有的组合,使他们的和等于35.
例如对于上面的数组,所有的组合情况为:
35;
-10+45;
17+18;
6+9+20;
-10+35+10;
-10+17+18+10;
-10+6+9+20+10;
注意,每一种组合中一个数只能出现一次。

当然我发表这篇文章之前看到很多人都有回复:我也写了个算法,可以处理这个问题,当然这是一个可以处理类似问题的(我写的是c语言的):

#include<stdio.h>

#include<malloc.h>

int num_n(int n);

int main()

{

int length,i,j,sum=0,num=0,m,give,k,h,n,r=0;

printf("输入数组长度/n");

scanf("%d",&length);

printf("输入要对比的数/n");

scanf("%d",&give);

int *array=(int*)malloc(length*sizeof(int));

for(i=0;i<length;i++)

{

printf("输入数组元素array[%d]=",i);

scanf("%d",array+i);

}

for(i=0;i<length;i++)

{

printf("现在数组中array[%d]=%d/n",i,array[i]);

}

int *p,*q;

q=p=(int*)malloc(length*sizeof(int));

for(i=0;i<length;i++)

{

*(p+i)=0;

}

for(i=0;i<length;i++)

{

printf("现在元素表示p[%d]=%d/n",i,p[i]);

}

num=num_n(length);

for(i=1;i<=num;i++)

{

m=i;

for(j=1;j<=length;j++)

{

k=m%2;

if(k==1)

{

sum+=array[j-1];

}

m=m/2;

}

if(sum==give)

{

int a=i;

for(j=1;j<=length;j++)

{

k=a%2;

printf("%d/t",k);

a=a/2;

}

printf("/n");

}

sum=0;

}

}

int num_n(int n)

{

if(n==1) return 2;

else return 2*num_n(n-1);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: