从铺砖问题到排列组合算法的实现

最近在某公众号上看到了一道算法题,在思考它的过程中发现了一些很有意思的新问题,解决后决定写下这篇博客记录一下。

首先来看看问题:
现在有两种砖,分别是是1*1,的砖和1*2的砖,用着两种砖铺1*n的地面。问共有多少种铺法?(输入为n,请输出相应的铺法数)

铺砖问题

Ok,那么让我们来先来分析一下这个问题吧。

一、用数学思维分析问题

根据题目我们可以知道砖一共两种,分别是1*1和1*2两种,需要把两种砖铺成1*N的面积。我们先换个思路,将这个问题转换成数学问题看看,设需要1*1的砖共x块,1*2的砖y块,则可以得出方程x+2y=n,函数图像如下图所示。

x+2y=n函数图像

因为x,y,n为正整数,所以对端点的取值仍然需要进行分析。x+2y=n与x轴的交点为(n,0),因为n为整数,所以(n,0)可以取到(对应情况为全部用1*1的砖铺);x+2y=n与y轴的交点为(0,n/2),这个点与n为奇数或偶数有关,当为奇数时这个点无法取到只能取与其最接近的y为整数的点尽可能使用1*2的砖铺,最后的空用1*1的补上)。

因为x+2y=n,所以x+y=n-y,取值范围为[n/2,n],因为n/2不一定符合要求,所以对于x+y的值得两个极值取值定义如下。

int maxCnt = n;    //全部使用1*1的砖
int minCnt = n/2 + n%2;    //尽可能使用1*2的砖

明确了这些我们就可

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值