組合問題的一般C 解法

2021-07-27 04:37:21 字數 947 閱讀 1193

很多問題都可以歸結為組合問題:即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...