排列组合相关笔试面试题(C++)

本文重点讲解如何使用C++解决常见的排列组合问题,适合笔试和面试准备。通过实例解析算法思路,帮助理解并掌握排列组合在编程中的应用。
摘要由CSDN通过智能技术生成
一、常考点
含有相同元素的全排列:例如2个a,3个b,4个c可以组成多少个不同的字符串?9!/2!/3!/4!。
n个人的全排列:排成一排为n!,排成一圈且考虑旋转带来的差异也为n!, 排成一圈但不考虑旋转差异则为(n-1)!
二、普通排列组合练习题
1、X*Y的方格阵中,从左上角走到右下角,每次只能走一格且只能向右走或向下走,有多少种走法
解法:向右一定走Y-1步,向下一定走X-1步,总共要走X+Y-2步,走法有C(X+Y-2,X-1)种。
当n<=10时:
组合数的计算方法一(利用递归公式):
class Robot {
public :       
     int C( int n, int m) {
         if (m ==  1 )
             return n;
         if (m == n || m ==  0 )
             return 1 ;
         return C(n- 1 ,m- 1 )+C(n- 1 ,m);
     }
     
     int countWays( int x,  int y) {       
         return C(x+y- 2 ,x- 1 );
     }
};
组合数的计算方法二(利用定义):
class  Robot {
public
:
     int  countWays( int  x,  int  y) {        
         int  n1 =  1 ,n2 =  1 ;
         for  ( int  i =  1 ,j = x+y- 2 ;i <= x- 1 ;i++,j--) {
            n1 *= i;
            n2 *= j;
        }
         return  n2/n1;
    }
};

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值