深搜練習 生成組合數

2021-10-03 14:17:22 字數 1728 閱讀 4663

0.總結

get to the key point firstly, the article comes from lawsonabs!

1.要求

從乙個有n個數的集合(無重複數字)中選擇m個數的集合出來,要做到不重不漏。

2.思路

2.1分治

在這 n 個數中,每個數都有選或不選兩種選擇。於是問題就轉換為:選擇當前的數,並從剩下的數中選擇m-1個 和 不選擇當前的數,但從剩下的數中選擇m個。這樣再分別解決子問題(從剩餘的t個數中選或者不選),就可以得到問題的解。

在遞迴的過程中,有一些可以稍微優化的方法,

3.實現

3.1 方法1

#include

using namespace std;

const

int maxn =10;

int n,m;

//從n個數中選擇m個

int arr[maxn]

;int vis[maxn]

;int choose[maxn]

;//選擇的結果集合

//start 是開始選擇的下標; cnt 表示選了多少個數

void

dfs(

int start,

int cnt)

/*1.選當前的數

*/ vis[start]=1

; choose[cnt]

= arr[start]

;dfs

(start+

1,cnt+1)

; vis[start]=0

;/*2.若有資格不選當前的數

*/if

(n - start >= m-cnt)

dfs(start+

1,cnt);}

intmain()

dfs(1,

0);}

3.2 方法2

這個方法2是結合洛谷的一道習題【p1036 選數】給出的。

#include

#include

using namespace std;

const

int n=25;

int n,k,res ;

//最終的結果數=》主要是為了去重

int vis[n]

,arr[n]

;//是否訪問過; 原始陣列

//判斷num是否是素數

bool isprime

(int num)

return true;

}//選數的過程

//cnt表示挑了幾個數;start表示需要從哪個位置開始選擇; sum表示已挑過的數的和

void

dfs(

int cnt,

int start,

int sum)

return;}

for(

int i = start;i}int

main()

dfs(0,

0,0)

; cout << res <<

"\n"

;}

測試用例如下:

4 1

2 3 4 5

4 22 3 4 5

4 33 7 12 19

深搜練習 生成全排列

0.總結 get to the key point firstly,the article comes from lawsonabs 1.前言 使用dfs 輸出數字n內的全排列。2.思想 2.1 深搜 涉及到這種選數問題,第一想到的應該就是深搜。因為深搜主要就是解決選不選這類問題。那該如何實現呢?根...

生成組合和排列

方法一 遞迴求解 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 intmai...

練習 生成器和模組

1.寫乙個生成式能夠產生的資料為 1,4,27,256,3125,9 9num1 n n for n in range 1,10 print next num1 2.寫乙個生成式能夠產生1 10中所有半徑是偶數的圓的面積num2 math.pi r 2 for r in range 1,11 if ...