n個數字取m個的組合數

2021-09-20 12:48:40 字數 874 閱讀 7548

對於這個問題有兩種版本,n個元素互不相同,n個元素有重複。有重複用集合之類的方法去重即可。

因此我們解決簡單版本假設n個元素互不相同。

emmm: 其實應該是同一種方法,第一種回朔法用了系統的棧空間,第二種用了自己建立的棧空間。相比較而言第二種演算法的空間複雜度會低一些,因為借助系統的棧會儲存好多多餘的資料。

廢話不多說,看**:

# coding: utf-8

def combination(arr, m):

s =

temp =

n = len(arr)

i = 0

while i < n:

if len(temp) < m:

if i < n-1:

i += 1

elif 1 < len(temp) < m: # i = n-1對於邊界情況需要特殊處理

temp.pop()

i = temp.pop()

i += 1

elif len(temp) == m:

continue

else:

break

else:

i = temp.pop()

print(s)

if i < n-1:

i += 1

elif len(temp) > 0: #對於邊界情況特殊處理

i = temp.pop()

i += 1

else: #主要針對m=1的特殊情況

break

return s

a = [4, 5, 6, 7]

print(combination(a, 1))

m個數取n個進行組合 C m n

m個數取n個進行組合 10反轉置換法 演算法思想 1 初始化乙個m個元素的陣列 全部由0,1組成 將前n個初始化為1,後面的為0。這時候就可以輸出第乙個組合序列了。2 從前往後找,找到第乙個10組合,將其反轉成01,然後將這個10組合前面的所有1,全部往左邊推 即保證其前面的1都在最左邊。這時又可以...

C 排列組合 N個數中取M個數

感謝一位好朋友和我分享了這樣的乙份 因為自己當時考慮的遞迴演算法相當糾結,怎樣遞迴都不大對,然後我的好朋友和我分享了一段這樣的 我現在分享給大家。題目 在n個數中取m個數,用的方法使用的是開闢乙個長度為100的int型陣列,0 1 2 99 100 比如說測試資料為 4 2 也就是從1 4中取2個數...

n全排列輸出和 n個數的組合 數字範圍a b

n全排列輸出 int wpermutation int num,bool brepeat num表示num全排列 brepeat標誌是否產生重複元素的序列。int permutation int n,int a,int cur,bool brepeat printf n else if ok ret...