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 如果遞歸進入了正數范圍,按照數組是全正數的情況正常處理*/