從陣列中取出N個元素的所有組合 遞迴實現

2022-08-05 15:51:22 字數 1745 閱讀 6216

今天在做poj 1753時,需要列舉一個陣列中所有組合。之前也遇到過類似的問題,如求從n個陣列任意選取一個元素的所有組合都是想起來比較簡單,但是設計成演算法卻頗費周折。

如陣列為,那麼從它中取出3個元素的組合有哪些,取出4個元素的組合呢?

比如取3個元素的組合,我們的思維是:

取1、2,然後再分別取3,4,5,6;

取1、3,然後再分別取4,5,6;

......

取2、3,然後再分別取4,5,5;

......

這樣按順序來,就可以保證完全沒有重複。

這種順序思維給我們的啟示便是這個問題可以用遞迴來實現,但是僅從上述描述來看,卻無法下手。

我們可以稍作改變:

1.先從陣列中a取出一個元素,然後再從餘下的元素b中取出一個元素,然後又在餘下的元素c中取出一個元素

2.按照陣列索引從小到大依次取,避免重複

1 #include2 #include3 #include4 #include5 #include

6 #include7

using

namespace

std;

8const

int maxn = 10010;9

const

int inf = 0x3f3f3f

;10 typedef long

long

ll;11

//a為原始陣列

12//

start為遍歷起始位置

13//

result儲存結果,為一維陣列

14//

count為result陣列的索引值,起輔助作用

15//

num為要選取的元素個數

16//

a_len為原始陣列的長度,為定值

17void combine_increase(int* a, int start, int* result, int count, const

int num,const

inta_len)

18 30 printf("\n"

);31}32

else

3336}37

}38//a為原始陣列

39//

start為遍歷起始位置

40//

result儲存結果,為一維陣列

41//

count為result陣列的索引值,起輔助作用

42//

num為要選取的元素個數

43void combine_decrease(int* a, int start, int* result, int count, const

intnum)

44 53

else

5460 printf("\n"

);61}62

}63}64

intmain()65;

67int num = 4;68

int result[4

];69 combine_increase(a, 0, result, num, num, sizeof a / sizeof(int

));70 printf("

分界線\n");

71 combine_decrease(a, sizeof a / sizeof(int

), result, num, num);

72return0;

73 }