m個數取n個進行組合:
[10反轉置換法]
演算法思想:
(1) 初始化乙個m個元素的陣列(全部由0,1組成),將前n個初始化為1,後面的為0。這時候就可以輸出第乙個組合序列了。
(2) 從前往後找,找到第乙個10組合,將其反轉成01,然後將這個10組合前面的所有1,全部往左邊推 ,即保證其前面的1都在最左邊。這時又可以輸出一組組合序列了。
(3) 重複第(2)步,知道找不到10組合位置。這時已經輸出了全部的可能
#include
#include
void putout(int * num,int m)
printf("\n");
}int check(int *num,int m,int n)
}return0;}
void chosenum(int *num,int m,int n)
if(*(num+i)) //統計前面出現出現1的次數
count++;
}for(j=0;jif(j//將前面幾個數全為1
else
//後幾個數為0
}putout(num,m);
if(check(num,m,n)!=1)
break;
}free(num);
}int main()
chosenum(num,m,n);
return
0;}
n個數字取m個的組合數
對於這個問題有兩種版本,n個元素互不相同,n個元素有重複。有重複用集合之類的方法去重即可。因此我們解決簡單版本假設n個元素互不相同。emmm 其實應該是同一種方法,第一種回朔法用了系統的棧空間,第二種用了自己建立的棧空間。相比較而言第二種演算法的空間複雜度會低一些,因為借助系統的棧會儲存好多多餘的資...
C 排列組合 N個數中取M個數
感謝一位好朋友和我分享了這樣的乙份 因為自己當時考慮的遞迴演算法相當糾結,怎樣遞迴都不大對,然後我的好朋友和我分享了一段這樣的 我現在分享給大家。題目 在n個數中取m個數,用的方法使用的是開闢乙個長度為100的int型陣列,0 1 2 99 100 比如說測試資料為 4 2 也就是從1 4中取2個數...
求 從m個自然數中任取n個數的所有組合
問題 編寫乙個遞迴演算法,找出從自然數1,2,3,m中任取n個數的所有組合。例如 m 5,n 3時,所有組合為543,542,541,532,531,521,432,431,421,321。方法1 設這m個自然數存放在整數陣列a k 中,a i 存放i 1 0 i n 1 可採用遞迴演算法,例如,m...