在數組中尋找和為定值的n個數


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM