基于排列與組合輸出多少中情況詳解
排列
#include <stdio.h>
// 主要是找到當前要排的 和后面要排數(shù)的關(guān)系
int swap(int m,int n)
{
if(n==1)
return m-n+1;
return m*swap(m-1,n-1);
}
int main()
{
int m=5,n=4;
printf("%d",swap(5,4));
}
組合
計算3個A,2個B可以組成多少種排列的問題
思路一:
#include <stdio.h>
/*
3個A,2個B 根據(jù)排列 第一個位置
可以是A也可以是B 如A_ _ _ _ 或著 B_ _ _ _ 由于第一個位置
確定了 一個字母 所以 如果確定的是A 則在剩下的四個位置中
就只能有 2個A ,2個B了 所以總的情況就是 A_ _ _ _ +B_ _ _ _ 兩個排列總數(shù)之和
*/
int f(int m, int n)
{
if(m==0 || n==0) return 1;
return f(m,n-1)+f(m-1,n);
}
void main ()
{
printf("%d ",f(3,2));
}
思路二:
#include <stdio.h>
#include <math.h>
/*
對于(m+n)!種排列方法是針對所有元素都不重復的情況下計算出的,
如果存在重復,則需要篩選出這些重復的排列情況。
于是我們可以采用捆綁法,將相同的元素綁在一起,由于是組合,所以內(nèi)部元素的排列問題不予考慮,
這些排列數(shù)總共有m!和n!,因此去掉這些重復情況后就得到(m+n)!/(m!*n!)中排法。
m個A n個B的排列一共有(m+n)!/(m!*n!)
而m-1個A n-1個B的排列一共有(m+n-2)!/((m-1)!*(n-1)!)
所以m個A n個B的排列數(shù)=m-1個A n-1個B的排列數(shù)*(m+n)*(m+n-1)/(m*n)
關(guān)鍵是找到(m個A和n個B的排列)和(m-1個A和n-1個B)之間關(guān)系
*/
int f(int m, int n)
{
if(m==0 || n==0) return 1;
return f(m-1,n-1)*(m+n-1)*(m+n)/m/n;
}
void main ()
{
printf("%d ",f(3,2));
}
相關(guān)文章
c語言中g(shù)etch,getche,getchar的區(qū)別
getche() 和getch()很相似,它也需要引入頭文件conio.h,那它們之間的區(qū)別又在哪里呢?不同之處就在于getch()無返回顯示,getche()有返回顯示2013-09-09C++實現(xiàn)LeetCode(117.每個節(jié)點的右向指針之二)
這篇文章主要介紹了C++實現(xiàn)LeetCode(117.每個節(jié)點的右向指針之二),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07數(shù)據(jù)結(jié)構(gòu) 紅黑樹的詳解
這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu) 紅黑樹的詳解的相關(guān)資料,數(shù)據(jù)結(jié)構(gòu)中的二叉樹查找,紅黑樹的講解,需要的朋友可以參考下2017-07-07Qt創(chuàng)建項目實戰(zhàn)之手把手創(chuàng)建第一個Qt項目
我們在進行軟件開發(fā)學習時,有時候需要qt軟件進行代碼的敲寫,下面這篇文章主要給大家介紹了關(guān)于Qt創(chuàng)建項目實戰(zhàn)之手把手創(chuàng)建第一個Qt項目的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-04-04