首页 > 其他分享 >排列组合的实现Cmn,Amn

排列组合的实现Cmn,Amn

时间:2023-05-24 15:55:43浏览次数:38  
标签:Cmn return Amn int res 元素 排列组合

递归方法:

public class Combination {

    /**
     * 计算从m个元素中选n个元素的组合数Cmn
     * @param m 总共有m个元素
     * @param n 从中选n个元素
     * @return 组合数Cmn的值
     */
    public static int Cmn(int m, int n) {
        if (n == 0 || n == m) {
            return 1;
        } else {
            // 两者可能,一个是选了n中的一个元素此时是Cmn(m-1, n-1),另一个是没选n中元素是Cmn(m-1, n)。
            return Cmn(m-1, n-1) + Cmn(m-1, n);
        }
    }

    /**
     * 计算从m个元素中选n个元素的排列数Amn
     * @param m 总共有m个元素
     * @param n 从中选n个元素
     * @return 排列数Amn的值
     */
    public static int Amn(int m, int n) {
        if (n > m) {
            return 0; // 选的元素个数大于总共的元素个数,无法排列,返回0
        } else if (n == 0) {
            return 1; // 选的元素个数为0,只有一种排列方式
        } else {
            return m * Amn(m-1, n-1);
        }
    }
}

非递归方法(自己手动实现模仿计算方式):
注意:再调用这个函数之前,用Cmn注意将N选比较小的。不然数据容易溢出()具体看后续例题

public static int myCmn(int m, int n) {
        if (n>m){
            return 0;
        }
        long res = 1;
        for (int i = m; i > m-n; i--) {
            res=res*i;
        }
        for (int i = 1; i <= n; i++) {
            res=res/i;
        }
        return (int)res;
    }


    public static int myAmn(int m, int n) {
        if (n>m){
            return 0;
        }
        int res = 1;
        for (int i = m; i > m-n; i--) {
            res=res*i;
        }

        return res;
    }

剑指 Offer II 098. 路径的数目

class Solution {
    public int uniquePaths(int m, int n) {
        int sum = m-1+n-1;
        int downStep = m > n?n-1:m-1;
        return Cmn(sum,downStep);
    }

    public int Cmn(int m, int n) {
        if (m < n) {
            return 0;
        }
        long res = 1;
        for (int i = m, j = 1; j <= n; i--, j++) {
            res *= i;
            res /= j;
        }
        return (int) res;
    }
}

标签:Cmn,return,Amn,int,res,元素,排列组合
From: https://www.cnblogs.com/chenyi502/p/17427461.html

相关文章

  • 排列组合的应用
    目录应用应用1:Leetcode.39题目分析代码实现方法一方法二应用2:Leetcode.40题目分析代码实现应用3:Leetcode.216题目分析代码实现方法一方法二应用4:Leetcode.78题目分析代码实现应用5:Leetcode.90题目分析代码实现应用6:Leetcode.77题目分析代码实现应用7:Leetcode.46题目分析代码实现应......
  • 番外篇:分享一道用Python基础+蒙特卡洛算法实现排列组合的题目(附源码)
    今日鸡汤夕阳无限好,只是近黄昏。    大家好,我是Python进阶者。    是不是觉得很诧异?明明上周刚发布了这篇:分享一道用Python基础+蒙特卡洛算法实现排列组合的题目(附源码),今天又来一篇,名曰番外篇!其实今天是想给大家分享【......
  • 分享一道用Python基础+蒙特卡洛算法实现排列组合的题目(附源码)
    今日鸡汤沙场烽火连胡月,海畔云山拥蓟城。    大家好,我是Python进阶者。这篇文章的题目真的是很难取,索性先取这个了,装个13好了。前言    前几天在才哥交流群里,有个叫【RickXiang】的粉丝在Python交流群里问了一道关于排列组合的问题,初步一看觉得很简单,实际上确实是有难度的......
  • python习题-排列组合序列
    【题目描述】用户输入整数n(1<=n<=26)和整数m(m<=n),然后输入n个不同的字母,请编写程序输出在这n个字母中选择m个字母的所有排列序列和组合序列。【源代码程序】importitertools#输入整数n和mn=int(input("请输入整数n(1<=n<=26):"))m=int(input("请输入整数m(m<=n):"))#输入......
  • 4.古典概型(排列组合)
    目录古典概率模型(排列组合)1.条件2.排列组合排列组合:从n个不同的元素,取出m个不同的元素古典概率模型(排列组合)1.条件有限个样本点等可能性(每个样本点发生的概率相同)\(P(A)=\frac{A的有利样本点}{\Omega中样本点总数}=\frac{A中包含的基本事件总数}{基本事件的总数}\)......
  • R语言_排列组合
    组合(combination)choose(n,r)参数:n:元素数量r:组合数返回:来自总共n个元素的r个组合的数量,即nCr值列出所有组合数矩阵:combn(x,n)阶乘:factorial(k)——k!排列(permutation)排列数:choose(n,k)*factorial(k)求排列数的话,可以用gtool......
  • 浅析排列组合、斯特林数、贝尔数、二项式定理与推论及其反演、子集反演、广义容斥
    浅析排列组合、斯特林数、贝尔数、二项式定理与推论及其反演、子集反演、广义容斥目录浅析排列组合、斯特林数、贝尔数、二项式定理与推论及其反演、子集反演、广义容斥更......
  • 排列组合去重方法
    题目40.组合总和II思路一道经典的排列组合去重问题,搜索的思路很简单,关键在于如何去重。借用一下代码随想录的图去重的工作实际上就是判断同一层上的相同元素是否已......
  • 排列组合学习笔记
    以下部分内容摘自OIWiki排列数从\(n\)个数中选出\(m\)个数按照一定的顺序排列,用\(A_{n}^{m}\)表示。排列的计算公式如下:\(A_{n}^{m}=n(n-1)(n-2)...(n-m+1)=\dfr......
  • 排列组合
    定义1.排列排列,一般地,从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列,叫做从n个元素中取出m个元素的一个排列。特别地,当m=n时,这个排列被称作全排列。......