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 ...