圖片是給的全排列的遞回,求求了,能否寫個全組合的遞回。。。卑微





uj5u.com熱心網友回復:
在線等待中

uj5u.com熱心網友回復:
全組合是指什么?選1個的組合+選2個的組合+...+選n個的組合?
uj5u.com熱心網友回復:
是的是的是的uj5u.com熱心網友回復:
可以用位圖法,n個數映射為n位整數,每位為1代表組合中有該數,0則沒有,所以:for (int i = 1; i < (1<< n); i++)
// 輸出i中為1的那些位對應的數就是一種組合
uj5u.com熱心網友回復:
給你寫個簡單的遞回例子
//引數說明
//src:備選的數字集合(陣列)
//len:備選數字集合的長度
//idx:備選數字集合中當前選擇元素的下標
//n:組合的元素個數
//res:組合結果
//pos:當前組合結果的下標
void combile(int *src, int len, int idx, int n, int *res, int pos) {
int i;
if (pos==n) { //如果組合結果的下標到達組合元素的個數,說明組合選擇完畢,列印組合結果
for (i=0; i<n; i++) {
printf("%d ", res[i]);
}
printf("\n");
return;
}
for (i=idx; i<len; i++) { //從當前下標開始回圈備選數字的集合
res[pos] = src[i]; //選中一個元素放到組合結果
combile(src, len, i+1, n, res, pos+1); //繼續從下標的下一個位置開始遞回
}
}
int main() {
//示例:列印{1,2,3,4,5}的全組合
int len=5, i;
int src[] = {1,2,3,4,5}, *res = (int*)malloc(len*sizeof(int));
for (i=1; i<=len; i++) { //從選1個到選5個的組合
printf("選%d個元素的組合\n", i);
combile(src, len, 0, i, res, 0);
printf("\n");
}
free(res);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/12663.html
標籤:新手樂園
上一篇:問一下現在譚浩強的《c++程式設計(第三版)》中的錯誤還多嗎?
下一篇:VS2019無法下載
