任意给一数组,如{-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);
}