• 华为机试-极限法(分苹果。剪绳子)


    描述

    把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?

    注意:如果有7个苹果和3个盘子,(5,1,1)和(1,5,1)被视为是同一种分法。

    数据范围:0 \le m \le 10 \0≤m≤10 ,1 \le n \le 10 \1≤n≤10 。

    输入描述:

    输入两个int整数

    输出描述:

    输出结果,int型

    示例1

    输入:

    7 3

    复制输出:

    8

    思考,把苹果放盘子里面,那么就有两种情况,一种是盘子里面有苹果,也就是有1到n的情况,还有一种就是存在两个或者以上的盘子,有盘子里面没有苹果。

    有两种极限情况,假设为n个苹果,m个盘子。一种有空盘子,那么就是n个苹果,放到m-1个盘子里面。或者假设所有盘子都放了一个苹果,那么就是把n-m个苹果,放m个盘子里面。

    1. def(m,n):
    2. if m == 0 or n == 0:return 0
    3. elif m == 1 or n == 1:return 1
    4. return f(m,n-1) + f(m-n,n)

    通过极限法去思考问题就很简单。

    还有一种递归法,思考的方式是

    1. def f(m,n):
    2. if m == 0 or n == 1:return 1
    3. elif n > m:
    4. return f(m,m)
    5. else:
    6. return f(m-n,n) + f(m,n-1)

    当盘子数量远大于苹果数量的时候,可以直接考虑将盘子数量减到苹果数量相等,其他的空盘子浪费测试。

    另外有种模式是剪切绳子。

    给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m-1] 。请问 k[0]*k[1]*...*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。

    示例 1:

    输入: 2
    输出: 1
    解释: 2 = 1 + 1, 1 × 1 = 1
    示例 2:

    输入: 10
    输出: 36
    解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/jian-sheng-zi-lcof
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    思考:剪绳子的思考方式也是极限法,比如,当绳子长度为2的时候,不需要剪,为3也不需要,当为4的时候,需要剪成2.2两部分,5的话。要剪成3.2两部分,如果是6的话,要剪成3,3才行,不能是2,4.再继续思考,如果是7的话,那就是3.4而不是2,5,所有知道,一直剪成3米最好

    1. import math
    2. class Solution:
    3. def cuttingRope(self, n: int) -> int:
    4. if n <= 3:return n -1
    5. if n % 3 == 1:return int(math.pow(3,(n//3) -1) * 4)
    6. if n % 3 == 0:return int(math.pow(3,n //3))
    7. return int(math.pow(3,n//3) * 2)

  • 相关阅读:
    2023/9/8 -- C++/QT
    码住!听我说护眼台灯这样选!
    python小游戏编程arcade----坦克动画图片合成
    操作系统【OS】进程的控制结构PCB
    黑豹程序员-架构师学习路线图-百科:Knife4j API接口文档管理
    Putty连接登录Linux .ppk
    【精品】轻松部署ceph分布式存储集群
    React-hook-form-mui(一):基本使用
    Android WMS——系统服务(二)
    算法小白的心得笔记:关于Nan
  • 原文地址:https://blog.csdn.net/weixin_55435895/article/details/126002716