分析:
求n個數的全排列,也就是:
第乙個數不動,將後面的n-1個數全排
將第二個數和第乙個數交換,將後面n-1個數全排列(注意要換回來)
將第三個數和第乙個數交換,然後將後面n-1個數全排
…將第n個數和第乙個數交換,然後將後面n-1個數全排
可以利用遞迴的思想來實現,直到n-1等於1
而取出m個數也就是讓n-m=1時結束就可以
下面直接貼**:
#include
//萬能標頭檔案
using
namespace std;
bool
is_swap
(int start ,
int last ,
int*p )
//判重,如果之間start~i間有重複的數字,則不進行交換,避免重複的情況出現
void
perm
(int start ,
int last ,
int*p ,
int len)
//進行全排列
else}}
intmain()
遞迴實現 從n個數中選取m個數的所有組合
有n n 0 個數,從中選取m n m 0 個數,找出所有的組合情況 不分順序 這樣的組合共有 cm n n n 1 n m 1 m 乙個陣列 data 有 n 個元素,從中選取 m 個數的組合 arr,使用遞迴演算法實現是這樣乙個過程 1 選擇 data的第1個元素為arr的第乙個元素,即 arr...
求n 中因子k的個數
思路 求n的階乘某個因子k的個數,如果n比較小,可以直接算出來,但是如果n很大,此時n 超出了資料的表示範圍,這種直接求的方法肯定行不通。其實n 可以表示成統一的方式。n km m a 其中k是該因子,m n k,a是不含因子k的數的乘積 下面推導這個公式 n n n 1 n 2 3 2 1 k 2...
從陣列中取出m個數相加的結果 組合
給定乙個陣列,輸入m,求出m個數相加的和。如num 6 include include using namespace std int flag 100 void dfs int num,int m,int sum,int now,set int ans for int i 0 i 5 i 從num...