排列组合C(n,m)和A(n,m)理解及代码实现

前言

写这个博客是因为在刷题的时候有时会遇到利用排列组合就可以很容易解决的事情,但是由于不知道排列组合算法就不得不用其他方法解题(如dfs),最后就造成了超时;排列组合应对不要求列出每种情况,只要求求出有多少情况。

C(n,m)

理解

从n个字符中选取m个字符,获得所有的组合

公式一

在这里插入图片描述

公式二

在这里插入图片描述
公式二可以这么理解,从n个物品中取m个有2种情况:(1)不取第n个物品,于是从前n-1个中取m个; (2)取第n个物品,于是从前n-1个中取m-1; 所以答案是这两种情况的和

两个性质:

1.C(n,m)=C(n,n-m)
2.C(n,m)=C(n-1,m)+C(n-1,m-1);(编程时可用此递推)

代码

速度惊人
排列组合数C(m,n)的O(n)算法

public class CAndA {
    // C(m,n)
    private long c(long m, long n) {
        //temp 为答案
        long temp = 1;
        //保证n>=m-n
        if (n < m - n)
            return c(m, m - n);
        for (int i = 0; i < m - n; ++i) {
            temp *= n + i + 1;
            temp /= i + 1;
        }
        return temp;
    }

    public static void main(String[] args) {
        CAndA cAndA = new CAndA();
        long l = System.currentTimeMillis();
        System.out.println(cAndA.c(100, 22));
        System.out.println(System.currentTimeMillis()-l);
    }
}

A(n,m)

理解

由公式A(n,m)=C(n,m)*A(m,m)可以将排列问题转换为组合问题和全排列问题,先得到C(n,m)的所有集合,然后对集合中的每一个字符串进行全排列,就得到了排列问题的解;

公式

在这里插入图片描述

代码

    // A(m,n)
    private long a(long m, long n) {
        long res = 1;
        for (long i = m; i > m - n; i--) {
            res *= i;
        }
        return res;
    }

参考博客

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值