給定乙個陣列,輸出其全組合 例如 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...