C++求全组合
求全組合
例如,在[1,n]這n個數中,選擇k個數,那么總共有多少種可能?把這些可能都列出來?
我們在數學上, C n k C_n^k Cnk?種可能一一列舉出來。
計算機在解決這個問題時,我們采用的時DFS的思路
思路一:全排列剪枝
組合問題實際是排列問題在不考慮數字順序的情況
在[1,n]這n個數中,選擇k個數,那么我們首先選擇第一個數,然后選擇第二個數,然后選擇第三個數,直到選擇到第k個數。
既然組合問題它不考慮數字的順序,那么我們不妨永遠保持它從小到大,即在選擇數的時候,要求這個數要比已經選擇的所有數大。
思路二:
我們同樣采用DFS算法,但是我們的思路是,依次考察1,2,…,k這些數,分別考慮它們在不在結果中,這種算法更加優越,因為它無形中就暗含著結果中數字是從小到大排序的。
vector<int> temp;vector<vector<int>> results;void dfs(int n,int k,int cur){//我們的思路是考察cur這個數是不是在temp中,一種是在,一種是不在//考察cur這個數時,[1,cur-1]都已經考察完了if(temp.size()==k){results.push_back(temp);return;}//如果temp中的數的個數加上剩下沒考慮的數 的個數之和小于k,這種就沒必要選取了if(n-cur+1+temp.size()<k){return;}//cur在temp中temp.push_back(cur);dfs(n,k,cur+1);temp.pop_back();//cur不在temp中dfs(n,k,cur+1);}總結
- 上一篇: ssm 框架在插入值的时候总是插不进去,
- 下一篇: 图的最短路径之Dijkstra求单源最短