亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++中求組合數的幾種方法總結

2020-02-24 14:34:58
字體:
來源:轉載
供稿:網友

關于C++,小編有自己的一些心得體會,曾深入的學習過,不過學無止境,也請C++高手多多指教~那接下來先附上這篇C++中求組合數的各種方法總結,想學習的同學,我們一起來了解下其中的詳情吧。C++

【問題】????? 組合問題

問題描述:找出從自然數1、2、... 、n中任取r個數的所有組合。例如n=5,r=3的所有組合為:

1,2,3
1,2,4
1,3,4
2,3,4
1,2,5
1,3,5
2,3,5
1,4,5
2,4,5
3,4,5

用程序實現有幾種方法:

1)窮舉法

程序如下
【程序】
#include
const int n=5,r=3;
int??? i,j,k,counts=0;

int main()
{
???? for(i=1;i<=r ;i++)
??????? for(j=i+1;j<=r+1;j++)
??????????? for( k=j+1;k<=r+2;k++){
?????????????? counts++;
?????????????? printf("%4d%4d%4d/n",i,j,k);
?????????? }
printf("%d",counts);
return 0;
}
但是這個程序都有一個問題,當r變化時,循環重數改變,這就影響了這一問題的解,即沒有一般性。


2)遞歸法
分析所列的10個組合,可以采用這樣的遞歸思想來考慮求組合函數的算法。
設函數為void??? comb(int m,int k)為找出從自然數1、2、... 、m中任取k個數的所有組
合。當組合的第一個數字選定時,其后的數字是從余下的m-1個數中取k-1數的組合。這
就將求m個數中取k個數的組合問題轉化成求m-1個數中取k-1個數的組合問題。設函數引
入工作數組a[ ]存放求出的組合的數字,約定函數將確定的k個數字組合的第一個數字放
在a[k]中,當一個組合求出后,才將a[ ]中的一個組合輸出。第一個數可以是m、m-1、
...、k,函數將確定組合的第一個數字放入數組后,有兩種可能的選擇,因還未去頂組
合的其余元素,繼續遞歸去確定;或因已確定了組合的全部元素,輸出這個組合。細節
見以下程序中的函數comb。
【程序】
#include
#include

using namespace std;

# define????? MAXN????? 100
int a[MAXN];
int counts=0;

void printtime(void) //打印當前時間的函數
{
????? char tmpbuf[128];
????? time_t ltime;
????? struct tm *today;

????? time( ????? today = localtime( ????? strftime(tmpbuf,128,"%Y-%m-%d %H:%M:%S",today);
????? cout<});


void????? comb(int m,int k)
{???? int i,j;
????? for (i=m;i>=k;i--)
????? {???? a[k]=i;
????????? if (k>1)
????????????? comb(i-1,k-1);
????????? else
????????? {??
????????????? counts++;
????????????? /*
????????????? for (j=a[0];j>0;j--)
????????????????? printf("%4d",a[j]);
????????????? printf("/n");
????????????? */
????????? }
????? }
}

int main()
{??

????? int m,r;
????? cout<<"m"<????? cin>>m;
????? cout<<"r"<????? cin>>r;
????? counts=0;
????? a[0]=r;
????? printtime();
????? comb(m,r);
????? cout<????? printtime();
????? return 0;
};
;

?


這是我在網上找到的程序,稍微修改了一下。程序寫的很簡潔,也具有通用性,解決了問題。

3)回溯法

采用回溯法找問題的解,將找到的組合以從小到大順序存于a[0],a[1],…,a[r-1]
中,組合的元素滿足以下性質:

(1)???? a[i+1]>a[i],后一個數字比前一個大;
(2)???? a[i]-i<=n-r+1。
按回溯法的思想,找解過程可以敘述如下:
????? 首先放棄組合數個數為r的條件,候選組合從只有一個數字1開始。因該候選
解滿足除問題規模之外的全部條件,擴大其規模,并使其滿足上述條件(1),候選組合
改為1,2。繼續這一過程,得到候選組合1,2,3。該候選解滿足包括問題規模在內的全
部條件,因而是一個解。在該解的基礎上,選下一個候選解,因a[2]上的3調整為4,以
及以后調整為5都滿足問題的全部要求,得到解1,2,4和1,2,5。由于對5不能再作調
整,就要從a[2]回溯到a[1],這時,a[1]=2,可以調整為3,并向前試探,得到解1,3,
4。重復上述向前試探和向后回溯,直至要從a[0]再回溯時,說明已經找完問題的全部
解。

在網上我始終沒有找到可以正常執行的完整程序,所以我只好花了一天的時間來自己來寫這個程序,并且改變輸出從0開始而不是從1開始,這樣做的目的是 為了擴展程序的用途,適應c/c++語言的需要,這樣輸出就可以當作要選擇的組合數組的地址序列,可以對長度為n任意類型數組找出r個組合。我對它進行了 優化,如果你認為還有可以優化的地方,請不惜賜教,。^_^

#include
#include
#include
using namespace std;

# define????? MAXN????? 100
int a[MAXN]; //定位數組,用于指示選取元素集合數組的位置,選取元素集合數組0 起始
void comb(int m,int r)
{??
????? int cur;//指示定位數組中哪個成員正在移進

????? unsigned int count=0;

????? //初始化定位數組,0 起始的位置 ,開始的選擇必是位置 0,1,2
????? for(int i=0;i????????? a[i]=i;;i++)

????? cur=r-1;//當前是最后一個成員要移進

?????? do{
????????? if (a[cur]-cur<=m-r ){?

????????????? count++;
????????????? /*
????????????? for (int j=0;j????????????????? cout<????????????? cout<????????????? */
????????????? a[cur]++;

????????????? continue;
????????? }
????????? else{
????????????? if (cur==0){
????????????????? cout<????????????????? break;
????????????? };
(4);j++)

????????????? a[--cur]++;
????????????? for(int i=1;i????????????????? a[cur+i]=a[cur]+i;
????????????? };i++){

????????????? if(a[cur]-cur????????????????? cur=r-1;???????????????
????????? }
????? }while (1);
})

?

?

void printtime(void) //打印當前時間的函數
{
????? char tmpbuf[128];
????? time_t ltime;
????? struct tm *today;

????? time( ????? today = localtime( ????? strftime(tmpbuf,128,"%Y-%m-%d %H:%M:%S",today);
????? cout<});

int main (int argc, char *argv[])
{

????? int m,r;
????? cout<<"m"<????? cin>>m;
????? cout<<"r"<????? cin>>r;
????? printtime();
????? comb(m,r);???
????? printtime();
????? return(0);
};
;

同上面的遞歸的程序進行比較,同樣用g++ o2優化。當n=40,r=11,屏蔽掉輸出,得到的結果都是2311801440項,遞歸程序用了23至24秒,回溯用了19至20秒。


4)利用數組

? 定義:從n個數中取出m個數的組合。
? 實現機理:先創建一個字符串數組,其下標表示 1 到 n 個數,數組元素的值為1表示其下標代表的數被選中,為0則沒選中。????
??? 然后初始化,將數組前 m 個元素置 1,表示第一個組合為前 m 個數。????
??? 然后從左到右掃描數組元素值的 10 組合,找到第一個 "10" 后交換 1 和 0 的位置,變為 01,而后將該10組合前的1和0重新組合(1放在前邊,其個數為10組合前1的個數,0放在后邊,其個數為10前0的個數,而后接10的倒轉組合 01)。當m 個 1 全部移動到最右端時,就得到了最后一個組合。????
??? 例如求 5 中選 3 的組合:????
??? 1???? 1???? 1???? 0???? 0???? //1,2,3????
??? 1???? 1???? 0???? 1???? 0???? //1,2,4????
??? 1???? 0???? 1???? 1???? 0???? //1,3,4????
??? 0???? 1???? 1???? 1???? 0???? //2,3,4????
??? 1???? 1???? 0???? 0???? 1???? //1,2,5????
??? 1???? 0???? 1???? 0???? 1???? //1,3,5????
??? 0???? 1???? 1???? 0???? 1???? //2,3,5????
??? 1???? 0???? 0???? 1???? 1???? //1,4,5????
??? 0???? 1???? 0???? 1???? 1???? //2,4,5????
??? 0???? 0???? 1???? 1???? 1???? //3,4,5??

以上就是C++中求組合數的幾種方法總結,如果大家想了解更多相關內容,請持續關注本站,本站小編將在第一時間為大家帶來更好的經典內容。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩女优人人人人射在线视频| 伊人久久久久久久久久久久久| 亚洲白拍色综合图区| 亚洲精品视频中文字幕| 亚洲欧美日韩一区二区三区在线| 久久中文字幕国产| 97久久精品视频| 日韩一二三在线视频播| 中国人与牲禽动交精品| 亚洲欧美中文字幕在线一区| 国产69精品99久久久久久宅男| 欧美成年人在线观看| 亚洲xxxxx| 色综合久久精品亚洲国产| 69国产精品成人在线播放| 欧美理论电影在线观看| 日韩av在线资源| 麻豆一区二区在线观看| 一本一本久久a久久精品综合小说| 亚洲大胆人体av| 亚洲a级在线观看| 国产精品自产拍在线观看| 欧美日韩精品国产| 日韩亚洲一区二区| 亚洲一区www| 国产玖玖精品视频| 午夜免费在线观看精品视频| 国产成人综合精品在线| 日韩中文字幕在线精品| 亚洲国产精品高清久久久| 亚洲欧美中文日韩在线| 成人在线观看视频网站| 北条麻妃一区二区在线观看| 成人激情免费在线| 精品久久久久久久久久久久久久| 亚洲一区二区久久| 在线播放国产精品| 久久久久久网址| 精品亚洲一区二区三区在线播放| 亚洲欧美中文字幕| 中文字幕亚洲字幕| 国产偷亚洲偷欧美偷精品| 久久久久久69| 欧美巨猛xxxx猛交黑人97人| 亚洲高清av在线| 精品国产成人av| 欧美有码在线观看视频| 国内精品久久久久久中文字幕| 色老头一区二区三区在线观看| 91亚洲va在线va天堂va国| 日韩女优人人人人射在线视频| 国产不卡视频在线| 高潮白浆女日韩av免费看| 91社区国产高清| 欧美精品久久一区二区| 日韩精品中文字幕视频在线| 欧美久久精品午夜青青大伊人| 美女性感视频久久久| 92福利视频午夜1000合集在线观看| 国产精品自在线| 日韩美女在线观看一区| 国模视频一区二区三区| 国产午夜精品全部视频播放| 亚洲电影在线看| 性色av一区二区咪爱| 国产婷婷97碰碰久久人人蜜臀| 最近更新的2019中文字幕| 欧美一区二粉嫩精品国产一线天| 久久99精品久久久久久琪琪| 国产精品日韩av| 国产亚洲aⅴaaaaaa毛片| 久久精品视频网站| 欧美成人手机在线| 亚洲综合大片69999| 久热在线中文字幕色999舞| 亚洲成人性视频| 亚洲精品97久久| 深夜福利91大全| 亚洲成人三级在线| 91久久精品国产91久久| 精品国内亚洲在观看18黄| 色偷偷偷综合中文字幕;dd| 国产精品久久精品| 久久精品国产一区| 欧美制服第一页| 96pao国产成视频永久免费| 亚洲色图狂野欧美| 亚洲精品国产品国语在线| 欧洲成人午夜免费大片| 国产精品久久久久久五月尺| 精品av在线播放| 国产成人精品视频在线| 亚洲性夜色噜噜噜7777| 一区二区三区亚洲| 一区二区三区四区在线观看视频| 亚洲天堂免费视频| 亚洲一区二区三区乱码aⅴ| 日韩免费精品视频| 国语自产精品视频在线看抢先版图片| 欧美另类69精品久久久久9999| 日韩电影中文字幕| 91精品啪aⅴ在线观看国产| 久久露脸国产精品| 亚洲一级片在线看| 日本高清视频精品| 精品国内亚洲在观看18黄| 久久国产精品电影| 欧美亚洲成人免费| 国产精品自拍偷拍| 7777精品久久久久久| 亚洲天堂男人天堂女人天堂| 在线观看欧美日韩国产| 国产欧美一区二区三区久久| 精品一区二区亚洲| 亚洲精品一二区| 日韩在线观看高清| 色青青草原桃花久久综合| 久久久国产精品视频| 国产91精品久久久| 国产精品一区久久| 最新的欧美黄色| 欧美激情一区二区三区成人| 国产欧美 在线欧美| 欧美亚洲国产成人精品| 国产z一区二区三区| 精品欧美一区二区三区| 国产精品自产拍在线观看| 国产黑人绿帽在线第一区| 国产亚洲综合久久| 日韩中文字幕亚洲| 成人国产精品一区| 4438全国亚洲精品在线观看视频| 亚洲 日韩 国产第一| 国产精品久久久久久久久久小说| 成人性教育视频在线观看| 久久的精品视频| 亚洲国产精彩中文乱码av在线播放| 91久久久久久久一区二区| 亚洲最大福利视频网站| 精品电影在线观看| 国产亚洲精品综合一区91| 国产精品入口夜色视频大尺度| 色在人av网站天堂精品| 欧美激情一区二区三区高清视频| 中国日韩欧美久久久久久久久| 丝袜一区二区三区| 成人日韩在线电影| 国产免费一区视频观看免费| 欧美午夜精品久久久久久人妖| 亚洲偷欧美偷国内偷| 国产精品网站视频| 91日韩在线播放| 在线观看免费高清视频97| 精品久久久久久亚洲精品| 欧美日韩国产精品一区二区三区四区| 国产精品欧美一区二区| 国产精品白丝jk喷水视频一区| 91精品久久久久久久久不口人| 国产在线精品成人一区二区三区| 国产精品自产拍在线观看| 欧美日韩裸体免费视频| 国产精品偷伦一区二区| 久久久av电影| 国产精品成人av性教育|