n個元素中取m個元素的組合 排列問題

2021-09-30 10:22:28 字數 2072 閱讀 7537

n個元素中取m個元素的組合

如a則有這些組合:1,2,3,12,13,23,123;

我們可以把問題分解如下:

1)求陣列中由1到n個元素的組合f(n,m) (m>=1 && m<=n;n為陣列元素個數);

2)對於f(n,m),我們從陣列中任意取乙個元素,然後再從剩下的n-1個元素中取m-1個元素,既f(n-1,m-1);

3)重複第2步,直到f(n-m+1,1),即從n-m+1個元素中取出最後乙個元素;

4)把有效的組合壓棧,並在壓棧前判斷該組合在棧中是否存在,避免由於陣列元素的重複而導致組合重複。

var result = new array();  //儲存所有組合的陣列  

function getallcomb(myarr)

//從陣列myarr(n)中任選m個元素的所有組合(m>=1 && m<=n)。

function getcomb(myarr,n,m,rs)

} //查詢某元素是否存在陣列中,存在返回true,不存在返回false

function checkexist(myarr,e)

;void dfscombination(int n, string& out)中挑2個出來。

2 | 3 4

2 | 3 5

2 | 4 5

------ c(3, 2)∵可以在中挑2個出來。

3 | 4 5

------ c(2, 2)∵只能在中挑2個出來。

這樣就很容易寫出遞迴演算法來。

algorithm combination(n, k, a[l..n+l-1])

if k = 0

print ary[1..k]

else

for i←1 to n-k+1

ary[index++] = a[l+i-1]

combination(n-i, k-1, a[l+i..n+l-1])

--index

endfor

大家可能會疑惑幹嘛要弄出個index,還有一加一減的(你手工算一下就知道了)。

可以在pku acm 2245 lotto 上試一試。

個數中選出m個數(m<=n)個的全部組合列印。

int *dst_array,top=0;//中間陣列,存放中間求解過程,count計數所有的組合個數

int cnt = 0;

//列印長度為n的陣列元素

static void printa(int*parray,int n)

else

//end for

}//end else

}int main()

{ char strsrc = "abcd";

permutation(strsrc,strsrc);

cout<< "共 " << g_scnt << " 種排列!" <

思路2——全排列的stl實現:

有時候遞迴的效率使得我們不得不考慮除此之外的其他實現,很多把遞迴演算法轉換到非遞迴形式的演算法是比較難的,這個時候我們不要忘記了標準模板庫stl已經實現的那些演算法,這讓我們非常輕鬆。

stl有乙個函式next_permutation(),它的作用是如果對於乙個序列,存在按照字典排序後這個排列的下乙個排列,那麼就返回true且產生這個排列,否則返回false。

注意,為了產生全排列,這個序列要是有序的,也就是說要呼叫一次sort。

實現很簡單,我們看一下**:

void permutation(char* str)

{ int length = strlen(str);

//第1步:排序

sort(str,str+length);

//第2步:呼叫函式next_permutationdo{

for(int i=0; i

思路3:全排列的字典樹實現

從 N 個元素中選取 M 個元素, 有多少種組合

演算法 從 n 個數字中選取 m 個,列印所有可能組合 使用乙個輔助陣列 aux 1.m 用來記錄 input 1.n 中被選中元素的索引 比如 input i 被選中,那麼中會有一項 aux i 從後向前計算 基本思想是,從 n 個元素中選取 m 個,首先選取第 m 個,然後在從剩下的選取 m 1...

每日一演算法 m元素中取n個元素 高效演算法

五個數種取三個 1 1 1 0 0 1 2 3 1 1 0 1 0 1 2 4 1 0 1 1 0 1 3 4 0 1 1 1 0 2 3 4 1 1 0 0 1 1 2 5 1 0 1 0 1 1 3 5 0 1 1 0 1 2 3 5 1 0 0 1 1 1 4 5 0 1 0 1 1 2 4 ...

在N個元素中選取前M個元素

import org.junit.test public class solution int arr maxarr arr,3 for int i 0 i 5 i 問題 在n個元素中選取前m個元素 思路 1 建立長度為m的陣列,作為最小堆 或則arr 0,m 1 構建小頂堆 3 先往最小堆中存入一...