三種用遞迴實現的列舉形式 指數 排列和組合

2022-05-25 15:42:21 字數 2264 閱讀 5592

這是演算法高階上的三個例子。

一、指數型列舉

從 1~n 這 n 個整數中隨機選取任意多個,輸出所有可能的選擇方案。

輸入格式

輸入乙個整數n。

輸出格式

每行輸出一種方案。

同一行內的數必須公升序排列,相鄰兩個數用恰好1個空格隔開。

對於沒有選任何數的方案,輸出空行。

本題有自定義校驗器(spj),各行(不同方案)之間的順序任意。

資料範圍1≤

n≤15'>1≤n≤15

每個點有選或不選兩種狀態,故共有2^n種排列。直接在每次縮小問題時列舉選或不選當前數字兩種狀態。

#include 

#include 

#include 

#include 

using namespace std;  

int n;  

vector sel;  

void cal(int x)   

cal(x + 1);  

sel.push_back(x);  

cal(x + 1);  

sel.pop_back();  

return;  

}  int main()   

當然,我們有更神奇的遞推做法來列舉二進位制子集。(我對它的正確性理解不能

#include 

#include 

using namespace std;  

int main()   

putchar('\n');  

return 0;  

}  二、遞迴實現組合型列舉

從 1~n 這 n 個整數中隨機選出 m 個,輸出所有可能的選擇方案。

輸入格式

兩個整數 n,m

'>n,m

,在同一行用空格隔開。

輸出格式

按照從小到大的順序輸出所有方案,每行1個。

首先,同一行內的數公升序排列,相鄰兩個數用乙個空格隔開。

其次,對於兩個不同的行,對應下標的數一一比較,字典序較小的排在前面(例如1 3 5 7排在1 3 6 8前面)。

資料範圍

n>

0'>n>0,0

≤m≤n

'>0≤m≤n,n

+(n−

m)≤25

'>n+(n−m)≤25

要保證選m個,給指數型列舉加上乙個剪枝就好了。如果要按字典序列舉,只要從小到大列舉數字,優先選擇選當前的數遞迴即可。

#include 

#include 

#include 

using namespace std;  

int n, m;  

vector sel;  

void cal(int x)   

sel.push_back(x);  

cal(x + 1);  

sel.pop_back();  

cal(x + 1);  

return;  

}  int main()   

(20.4.25更新)改良上述方法,無需剪枝,只要保證每次從當前數列最後一項向上列舉下一項即可。

**:#include 

#include 

#include 

#include 

using namespace std;  

int a[11], n, m;  

void cal(int k)   

for (int i = a[k-1]+1; i <= n; ++i)   

return;  

}  int main()   

三、遞迴實現排列型列舉

列舉全排列用庫函式next_permutation()即可。用遞迴來實現的話,我們從當前未選擇的數中從小到大列舉下乙個位置上的數,同樣可以保證按字典序列舉。

#include 

#include 

#include 

#include 

using namespace std;  

int a[11], n;  

bool vis[11];  

void cal(int k)   

for (int i = 1; i <= n; ++i)   

return;  

}  int main()   

int mainx()  while (next_permutation(a + 1, a + 1 + n));  

return 0;  

}  

if 語句的三種形式

if 語句的三種形式 第一種形式為基本形式 if 如果表示式的值為真,則執行其後的語句,否則不執行該語句。第二種形式為 if else 如果表示式的值為真,則執行語句1,否則執行語句2。第三種形式為 if else if 依次判斷表示式的值,當出現某個值為真時,則執行其對應的語句。然後跳到整個if語...

樹的三種遍歷 遞迴和非遞迴形式的python實現

class treenode object 建立樹的結構 def init self,x self.val x self.left none self.right none 遞迴形式 前序遍歷 defpreorderrecusive root if root none return none pri...

梯度下降的三種形式

1 批量梯度下降法bgd 批量梯度下降法 batch gradient descent,簡稱bgd 是梯度下降法最原始的形式,它的具體思路是在更新每一引數時都使用所有的樣本來進行更新。優點 全域性最優解 易於並行實現 缺點 當樣本數目很多時,訓練過程會很慢。2 隨機梯度下降法sgd 隨機梯度下降是通...