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

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

今天在做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 }

求從n個陣列任意選取乙個元素的所有組合

最近做專案碰到這個問題,如題從n個陣列任意選取乙個元素的所有組合。比如已知陣列是 1,3 2,4 5 最後組合結果是 1,2,5 1,4,5 3,2,5 3,4,5 網上看了好多帖子,發現寫的太複雜,於是自己動手解決。直接貼解決方案 方法一 執行組合排列的函式 function doexchange...

js從陣列中取出n個不重複的資料

首先,針對這個陣列做乙個去重處理,避免你在後面取資料的時候,因為取到相同的元素而又要多去取一次隨機數 將獲取到的不重複的陣列,再到這裡樣本裡面去取隨機數 每取到一次,就將這個元素從 不重複的陣列 中刪除,這樣length就會 減1 最後返回我們取到的陣列,就是不重複的資料 array 傳入的陣列 去...

排列組合 從n個自然數中取出r個數的組合

這種題目一般有兩種方法,比較直接的方法就是使用循壞,但是對於這種方法只有r小於等於4時才是可行的,這個時候複雜度是 o n r 可知,這種方法的時間複雜度很高,而且這種迴圈機制嚴重依賴r,通過r來控制迴圈層數,因此這種方法不具有普遍性。最常用的方法就是使用遞迴。在迴圈演算法設計中,每個組合中的資料都...