排列组合问题初步
2016-09-29 19:12
344 查看
1. 从n个人中选择k个人的不同组合数
法一:递归
由n个人里选k个人的组合数=由n-1个人里选k个人的组合数+由n-1个人里选k-1个人的组合数。此公式本身是递归的,因此可编写递归函数实现这一过程,其中递推结束条件是n=k或k=0,这时的组合数为1,然后开始回归。
源代码:
程序截图:
![](http://img.blog.csdn.net/20160929190350118?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
法二:直接套用约分后的组合数公式,并写成普通函数
源代码:
程序截图:
法一:递归
由n个人里选k个人的组合数=由n-1个人里选k个人的组合数+由n-1个人里选k-1个人的组合数。此公式本身是递归的,因此可编写递归函数实现这一过程,其中递推结束条件是n=k或k=0,这时的组合数为1,然后开始回归。
源代码:
#include <iostream> using namespace std; int comm(int n,int k) { if(k>n) return 0; else if(n==k || k==0) return 1; else return comm(n-1,k)+comm(n-1,k-1); //“递归”,即自身调用 } int main() { int n,k; while(cin>>n>>k) cout<<comm(n,k)<<endl; return 0; }
程序截图:
法二:直接套用约分后的组合数公式,并写成普通函数
源代码:
#include <iostream> using namespace std; int fun(int n,int k) { double fz,fm,fm1,fm2; int i,j; fz=1,fm=1; fm1=k; fm2=n-k; for(i=((fm1>fm2)?fm1:fm2)+1;i<=n;i++) fz*=i; for(j=1;j<=((fm1<fm2)?fm1:fm2);j++) fm*=j; return fz/fm; } int main() { int n,k; while(cin>>n>>k) cout<<fun(n,k)<<endl; return 0; }
程序截图:
相关文章推荐
- Java解决排列组合问题——深度优先遍历
- 排列组合问题
- EularProject 43: 带条件约束的排列组合挑选问题
- 排列组合问题
- 字符串的排列组合问题
- Oracle SQL排列组合之排列问题
- 排列与组合问题
- 算法基础:排列组合问题-全排列(Golang实现)
- 排列组合问题汇总
- java递归算法中的排列组合问题及排列组合去重
- Java解决排列组合问题——深度优先遍历
- java实现字符串排列组合问题
- 排列组合问题的通用算法
- python 排列组合 解决实际问题
- 排列组合问题
- 排列组合问题1
- 排列组合之排列问题的算法实现
- 排列组合问题:n个数中取m个(Golang实现)
- 全排列问题、八皇后问题、组合问题的递归解法
- iOS 借助排列组合求赛事投注的注数问题。