這是演算法高階上的三個例子。
一、指數型列舉
從 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 隨機梯度下降是通...