很多問題都可以歸結為組合問題:即c(n,m)---從n個元素中取m個,儲存所有組合情況。
組合問題與排列問題不應該混為一談,排列需要考慮所取元素的放置順序,而組合問題則不考慮。
stl中提供的next_permutation解決的是排列問題,而且是全排列問題,即n個元素取出所有元素進行排列。
本篇記錄一般性組合問題的c++實現。
1.對於m較小的情況(通常3以下)可以直接列舉:
比如c(5,3)直接列舉即三重迴圈:
for(int i=0;i2.對於m較大時,列舉迴圈重數過大,可採用遞迴實現一般性的組合函式:
//組合問題c(n,m):n個元素中取m個,儲存所有組合情況
void combine(int data,int n,int m,int temp,const int m,vector> &vec_res)
vec_res.push_back(vec_temp);
} }}
網上的做法是直接列印結果,為方便使用,對其進行修改,加入結果集引數vec_res,作為二維動態陣列的引用,儲存所有的組合情況,便於提取進一步處理。main中呼叫方法如下:
vector> vec_res;
int *data=new int[n];
int *temp=new int[m];
for(int i=0;i測試結果如圖:
為方便和排列問題比較,呼叫stl的排列演算法,列印1,2,3序列的全排列輸出:
//對比全排列問題
sort(data,data+n);
for(int i=0;i
N皇后問題的一般解法 回溯法
先上 include include include include using namespace std vectorboard void showqueen void cout endl bool isvalid int rows,int cols,int order return true ...
C 解決一般大數統計問題
題目描述 description 問題描述 某次科研調查時得到了n個自然數,每個數均不超過1500000000 1.5 109 已知不相同的數 不超過10000 個,現在需要統計這些自然數各自出現的次數,並按照自然數從小到大的順序輸出統 計結果。輸入描述 input description 第1行是...
CCF 201703 2學生排隊(一般解法)
問題描述 體育老師小明要將自己班上的學生按順序排隊。他首先讓學生按學號從小到大的順序排成一排,學號小的排在前面,然後進行多次調整。一次調整小明可能讓一位同學出隊,向前或者向後移動一段距離後再插入佇列。例如,下面給出了一組移動的例子,例子中學生的人數為8人。0 初始佇列中學生的學號依次為1,2,3,4...