演算法22 全組合

2021-08-31 18:21:21 字數 1338 閱讀 4559

給定乙個陣列,輸出其全組合  例如 123   輸出  1,2,3,12,13,23,123

解法一:

對於n位資料,考慮每一位對於組合結果的影響,對於每一位可以選擇取或者不取。一共有power(2,n)中取法,當全部不取時,對於最後結果沒有意義,因此最終取法共有power(2,n)-1.可以利用二進位制數字從1變為n,剛好變化過程中的二進位制01分別對應每一位的取值情況,輸出每一種情況即可。

def combination(num):

n = len(num)

nbit = 1 << n

for i in range(0, nbit):

for j in range(0, n):

tmp = 1 << j

if tmp&i != 0:

print (num[j],end='')

print ()

假設輸入1234, 首先求出陣列長度n=4,  構造power(2,n)-1  例如n=4  則nbit=1111,  注意陣列下標從0開始

變數i從0000---1111   若i=1001,說明陣列的第0位以及第3位被選擇,可以輸出   

j表示陣列的左起第幾位需要輸出,若j=0,說明當前為陣列第0位  j=n-1說明當前為陣列第n-1位

然後j依次搜尋i個二進位制各位如果某一位等於1,則把相應的num[j]給輸出即可。

解法二:

給定n位資料,其全組合的選擇長度依次為1,2.。。。n.現在考慮長度為k的組合序列,若要產生長度為k的序列,考慮第1位,若選擇第一位,則從後面n-1中選擇k-1位分別與第一位組合即可,若選擇第二位,則從後面n-2位中選擇k-1位即可。由於k<=n,臨界條件是k==0,此時直接返回空即可。

產生長度為k的序列如下:

def combination_k(num, k):

r =

if k==0:

return ['']

for i in range(len(num)):

for letter in combination_k(num[i+1:], k-1):

#print ("letter",letter)

r += [num[i]+letter]

return r

遍歷所有的k的取值,得到全組合:

def combination_all(num):

all =

for i in range(1,len(num)+1):

all += combination_k(num, i)

return all

全組合 動態規劃

include include includeusing namespace std vectorresult int hashtable 26 bool flag false int main string a cin a int len a.length int i for i 0 i iter...

Java實現全組合

abs 的all combination is abc,a,b,c,ab,ac,bc 2 n 1次 public class combination system.out.println system.out.println result num is nbit 1 public static vo...

遞迴學習 組合 全組合排列

sample input 1 2 3 sample output include using namespace std const int len 10 int n int mat len int result len bool used len 初始值為false,表示都沒有使用過 void s...