C語言回溯法 實現(xiàn)組合數(shù) 從N個數(shù)中選擇M個數(shù)
更新時間:2018年08月11日 16:19:42 作者:Alger_jhun
在平時的算法的題目中,時常會遇到組合數(shù)相關(guān)的問題,暴力枚舉。在N個數(shù)中挑選M個數(shù)出來。利用for循環(huán)也可以處理,但是可拓展性不強,于是寫這個模板供以后參考
前言
在平時的算法的題目中,時常會遇到組合數(shù)相關(guān)的問題,暴力枚舉。在N個數(shù)中挑選M個數(shù)出來。利用for循環(huán)也可以處理,但是可拓展性不強,于是寫這個模板供以后參考。
兩個函數(shù)和全局變量可以直接用。
代碼:
#include<iostream> #include<cstdio> #define N 10 //被選擇的數(shù)目 #define M 5 //要選出來的數(shù)目 using namespace std; int vis[N+1]; //標(biāo)志, int ans=0; //含有的組合數(shù) 的數(shù)量 int num[M+1]; //選出來的數(shù)放在num數(shù)組里面 void solve() { //在solve函數(shù)里面處理 for(int i=1; i<M+1; i++) cout<<num[i]<<" "; cout<<endl; } void dfs(int index) { //挑選的第index+1個數(shù) if(index == M) { solve(); ans++; return ; } for(int i=num[index]+1; i<N+1; i++) { if(!vis[i]) { vis[i] = 1; num[index+1] = i; dfs(index+1); vis[i] = 0; } } } int main() { dfs(0); //回溯開始 cout<<endl<<ans; return 0; }
可以發(fā)現(xiàn)利用回溯法挑選的有一個優(yōu)勢在于,輸出的數(shù)組是經(jīng)過排序的。
相關(guān)文章
C語言位段(位域)機制結(jié)構(gòu)體的特殊實現(xiàn)及解析
這篇文章主要為大家介紹了C語言位段位域機制結(jié)構(gòu)體的特殊實現(xiàn)講解有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪2022-02-02C++深入分析數(shù)據(jù)在內(nèi)存中的存儲形態(tài)
使用編程語言進行編程時,需要用到各種變量來存儲各種信息。變量保留的是它所存儲的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個變量時,就會在內(nèi)存中保留一些空間。您可能需要存儲各種數(shù)據(jù)類型的信息,操作系統(tǒng)會根據(jù)變量的數(shù)據(jù)類型,來分配內(nèi)存和決定在保留內(nèi)存中存儲什么2023-01-01