1 /*-------------------------------------------------------*/ 2 /*寻找和为定值的两个数 3 输入一个数组A[0,N-1]和一个数字Sum,在数组中查找 4 两个数Ai,Aj,是真的Ai+Aj=Sum*/ 5 /*解法一:暴力求解*/ 6 /*解法二:一个数组两头扫*/ 7 8 void TwoSum(int data[],unsigned int length, int sum){ 9 //sort(data,data+length) 如果数组是有序的,那就事先排好序O(NlonN) 10 int begin=0; 11 int end=;ength-1; 12 while(begin<end){ 13 long currSum=data[begin]+data[end]; 14 if(currSum==sum){ 15 printf("%d %d\n",data[begin],data[end]); 16 //如果需要所有满足条件的数组对,则需要加上下面两条语句 17 //begin++; 18 //end--; 19 break; 20 } 21 else{ 22 if(currSum<sum) begin++; 23 else end--; 24 } 25 } 26 } 27 /*-------------------------------------------------------*/ 28 /*寻找何为定值的m个数(不考虑存在负数的情况)*/ 29 /*已知数组A[0...N-1],给定某数值sum,找出数组中的若干个数, 30 使得这些数的和为sum*/ 31 int a[]={1,2,3,4,5}; 32 int size=sizeof(a)/sizeof(int); 33 int sum=10;//sum为计算的和 34 35 //x[]为最终解,x与a下标对应.i为考察x[i]是否加入,has表示当前的和 36 void EnumNumber(bool* x,int i,int has){ 37 if(i>=size) return ; 38 if(has+a[i]==sum){//如果当前的和加上a[i]满足sum 39 x[i]=true;//代表a[i]要输出 40 Print(x);//这个打印函数没写,自己可以加上去 41 x[i]=false;//改为false,准备下一轮 42 } 43 44 x[i]=true; 45 EnumNumber(x,i+1,has+a[i]); 46 47 x[i]=false; 48 EnumNumber(x,i+1,has); 49 } 50 51 int main(){ 52 bool* x=new bool[size]; 53 memset(x,0,size); 54 EnumNumber(x,0,0); 55 delete[] x; 56 return 0; 57 } 58 /*考虑负数的情况*/ 59 /* 60 可对整个数组A[0...N-1]进行正负排序,使得负数都在前面,正数都在后面 61 使用剩余正数的和作为分支限定的约束 62 如果A[i]为负数,全部正整数都算上还不够,就不能选A[i] 63 如果递归进入了正数范围,按照数组是全正数的情况正常处理*/