下面我是不隨機選定數的,妳看看是否有用
思路是:
定義壹個數組,用來存放已入選的數。
在主要實現函數search中,sum表示已入選的數的和,index表示數組中下壹個數的存放位置的下標,big表示從不大於big的數中選數,從最大的可選數top開始。
如果big 和sum的和比目標小,就把big寫入數組,進入下壹輪搜索,
新搜索參數index+1,big-1。
如果想等,則把big寫入數組,打印數組中直到index下標的數,也就是相加等於目標的數
如果大於,就什麽都不做了。
最後search調用自己,在big- 1 的可選數中搜索壹遍。因為是遞歸調用的,所以big-2,big-3...
直到base都會調用壹遍。
結束條件為 搜索的範圍小於可選的最小數,即沒有數可選時。
#include<stdio.h>
#define base 1
#define top 8
#define TARGET 20
int arr[8-1+2]; //to store selected numbers
void show(int index){
int i;
for(i = 0; i <= index; ++i)
printf("%d\t", arr[i]);
printf("\n");
}
void search(int sum, int index, int big){ //big is the biggest number can be chose from to continue adding up
//if big < base, sum cannot increase, exit
if(big < base)
return;
if(sum + big < TARGET){
arr[index] = big;
search(sum + big, index + 1, big - 1);
}else if (sum + big == TARGET){
arr[index] = big;
show(index);
}
search(sum, index, big - 1);
}
int main(){
search(0, 0, top);
return 0;
}