生成組合和排列

2022-09-15 08:57:08 字數 1762 閱讀 9157

方法一:遞迴求解

(1)、從 n 個元素中,選擇 m 個元素的組合

#includeusing

namespace

std;

int ans[10],a[20

],m,n;

bool visited[20];

void

output()

void work(int i,intk)

for(;k<=n;k++) //

flag1

} }

intmain()

work(

1,1);

}return0;

}

輸入:3 2 

1 3 5

輸出:1 3

1 53 5

(2)、從n

個元素中選擇

m個元素的排列

只需在flag1

出的for

迴圈中k=1

輸入:3 2

1 3 5

輸出:1 3

1 53 1

3 55 1

5 3(3)、從n

個元素中選擇

m個元素的可重複組合

只需把flag2

出的visitted

注釋掉輸入:

3 31 3 5

輸出:1 1 1

1 1 3

1 1 5

1 3 3

1 3 5

1 5 5

3 3 3

3 3 5

3 5 5

5 5 5

方法二:狀態壓縮

(1)、從

n個元素中選擇

m個元素的組合

#include#include

#include

using

namespace

std;

int a[20],p[20

],m,n;

bool judge(int x)//

判斷x轉換成二進位制中1的個數

if(cnt==m) return

true

;

return

false;}

void

work()

printf("\n

");}

}}int

main()

work();

}return0;

}

輸入:3 2

輸出:1 3

1 53 5

方法三:使用stl

中的 next_permutation 函式

(1)生成全排列

#include#include

#include

using

namespace

std;

int p[20

],n;

void

work()

while(next_permutation(p,p+n));

//prev_permutation(p,p+n)

//生成降序

}int

main()

work();

}return0;

}

輸入:3

3 1 5

輸出:1 3 5

1 5 3

3 1 5

3 5 1

5 1 3

5 3 1

深搜練習 生成組合數

0.總結 get to the key point firstly,the article comes from lawsonabs 1.要求 從乙個有n個數的集合 無重複數字 中選擇m個數的集合出來,要做到不重不漏。2.思路 2.1分治 在這 n 個數中,每個數都有選或不選兩種選擇。於是問題就轉換...

利用字典序法生成組合數

在組合數學的這本書中,生成組合數字有很多中方法,比較常用的序數法,字典序法 本文採用字典序法,生成一堆組合數字,即c n,r 從n個數字中取得r個,演算法完整的定義如下 從中取r 組合表示為c1c2 cr,令c1 c2 cr,其中有i ci n r i i 1,2,r 第乙個組合為 生成後序組合的規...

排列和組合

排列組合計算公式 排列a n,m n n 1 n m 1 n!n m n為下標,m為上標,以下同 組合c n,m a n,m a m,m n!m!n m 問題 從1到n 包含 中選出m n個數,在下列情況下,有多少種組合?限制條件 1 無限制 2 各位數字公升序排列 3 不能有重複數字 4 各位數字...