国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C++ > 正文

組合問題的一般C++解法

2019-11-08 02:24:42
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

很多問題都可以歸結(jié)為組合問題:即C(n,m)---從n個(gè)元素中取m個(gè),保存所有組合情況。

組合問題與排列問題不應(yīng)該混為一談,排列需要考慮所取元素的放置順序,而組合問題則不考慮。

STL中提供的next_permutation解決的是排列問題,而且是全排列問題,即n個(gè)元素取出所有元素進(jìn)行排列。

本篇記錄一般性組合問題的C++實(shí)現(xiàn)。

1.對(duì)于m較小的情況(通常3以下)可以直接枚舉:

比如C(5,3)直接枚舉即三重循環(huán):

		for(int i=0;i<n;i++){			for(int j=i+1;j<n;j++){				for(int k=j+1;k<n;k++){					cout<<data[i]<<" "<<data[j]<<" "<<data[k]<<endl;				}			}		}2.對(duì)于m較大時(shí),枚舉循環(huán)重?cái)?shù)過大,可采用遞歸實(shí)現(xiàn)一般性的組合函數(shù):

//組合問題C(n,m):n個(gè)元素中取m個(gè),保存所有組合情況void combine(int data[],int n,int m,int temp[],const int M,vector<vector<int> > &vec_res){	for(int i=n; i>=m; i--)   // 注意這里的循環(huán)范圍	{		temp[m-1] = i - 1;		if (m > 1)		    combine(data,i-1,m-1,temp,M,vec_res);		else                     // m == 1, 輸出一個(gè)組合		{			vector<int > vec_temp;		    for(int j=M-1; j>=0; j--){				vec_temp.push_back(data[temp[j]]);		    }		    vec_res.push_back(vec_temp);		}	}}網(wǎng)上的做法是直接打印結(jié)果,為方便使用,對(duì)其進(jìn)行修改,加入結(jié)果集參數(shù)vec_res,作為二維動(dòng)態(tài)數(shù)組的引用,存儲(chǔ)所有的組合情況,便于提取進(jìn)一步處理。main中調(diào)用方法如下:

		vector<vector<int> > vec_res;		int *data=new int[n];		int *temp=new int[m];		for(int i=0;i<n;i++){			data[i]=i+1;//測(cè)試數(shù)據(jù)為1...n		}		combine(data,n,m,temp,m,vec_res);		for(auto temp:vec_res){			for(auto e:temp){				cout<<e<<" ";			}			cout<<endl;		} 測(cè)試結(jié)果如圖:

為方便和排列問題比較,調(diào)用STL的排列算法,打印1,2,3序列的全排列輸出:

		//對(duì)比全排列問題		sort(data,data+n);		for(int i=0;i<n;i++)			cout<<data[i]<<" ";		while(next_permutation(data,data+n)){			for(int i=0;i<n;i++){				cout<<data[i]<<" ";			}			cout<<endl;		}


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 高密市| 田林县| 新晃| 连南| 祁阳县| 石狮市| 武川县| 淮阳县| 康马县| 大厂| 游戏| 陵川县| 广平县| 宾阳县| 大新县| 毕节市| 齐齐哈尔市| 岗巴县| 三门县| 恭城| 乳山市| 广西| 彰化县| 义马市| 道真| 观塘区| 通渭县| 元谋县| 弥渡县| 蒙阴县| 东乌珠穆沁旗| 上蔡县| 苏州市| 麻江县| 连州市| 准格尔旗| 商丘市| 滕州市| 乌鲁木齐县| 上饶县| 安龙县|