蓝桥杯真题-分糖果-题解

链接:https://www.lanqiao.cn/problems/4124/learning/

题目

++复述:两种糖果,分别有9和16,分给7人,每个人得到的最少2,最多5,必需全部分完,几种分法?++

复习-深度优先搜索

深度优先搜索(DFS)

深度优先搜索是一种用于遍历或搜索树或图的算法。这个算法会尽可能深地搜索图的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。

**实现方法:**通常使用递归或栈来实现DFS。从根节点开始,首先访问它的第一个邻接节点,然后递归地对这个邻接节点执行相同的操作,直到当前节点的所有邻接节点都被访问过。然后,返回到上一个节点,继续访问它的下一个未访问的邻接节点。重复这个过程,直到所有节点都被访问过。

思路

目标是分糖果,每个人糖果数量有限制,有两种糖果,每种糖果要数量有限制,并且糖果要恰好分完。

我首先想到的就是按人分,每个人都有多种分法(满足 2<=a+b<=5 ),一个人分完后分下一个人(脑子中就会萌生递归的想法)。考虑到题目中的限制(只要有其中一个小朋友在两种方案中分到的糖果不完全相同,这两种方案就算作不同的方案。),我们需要同时考虑a与b两种,这样子才可以更好考虑多种方案。

运用深度优先算法的思想,进行递归,设置深度,以及两个糖果的个数a和b,最终答案用全局变量(global)res表示,当深度为7也就是第七个孩子,且糖果为0时则是一种分法。

具体的分法用两层for循环在(0,n+1)和(0,m+1)进行枚举寻找,并且增加限制条件a+b小于等于2,大于等于5。递归时要记得变化参数dfs(depth+1,n-i,m-j),然后等程序执行完毕

代码

python 复制代码
res=0
def divide(n,a,b): # n从0开始
    global res
    if n==7:
        if a==0 and b==0:
            res+=1
        return 
    for i in range(a+1):
        for j in range(b+1):
            ab=i+j
            if ab<=5 and ab>=2:
                divide(n+1,a-i,b-j)

divide(0,9,16)
print(res)

很多时候算法的求解方法是可与而不可求的,所以要不断积累内化,才能够有机会去思考出解决方案。

相关推荐
火车叼位1 小时前
也许你不需要创建.venv, 此规范使python脚本自备依赖
python
YuTaoShao1 小时前
【LeetCode 每日一题】1653. 使字符串平衡的最少删除次数——(解法一)前后缀分解
算法·leetcode·职场和发展
火车叼位1 小时前
脚本伪装:让 Python 与 Node.js 像原生 Shell 命令一样运行
运维·javascript·python
VT.馒头1 小时前
【力扣】2727. 判断对象是否为空
javascript·数据结构·算法·leetcode·职场和发展
goodluckyaa1 小时前
LCR 006. 两数之和 II - 输入有序数组
算法
孤狼warrior1 小时前
YOLO目标检测 一千字解析yolo最初的摸样 模型下载,数据集构建及模型训练代码
人工智能·python·深度学习·算法·yolo·目标检测·目标跟踪
Katecat996631 小时前
YOLO11分割算法实现甲状腺超声病灶自动检测与定位_DWR方法应用
python
Σίσυφος19001 小时前
PCL法向量估计 之 RANSAC 平面估计法向量
算法·机器学习·平面
xhbaitxl2 小时前
算法学习day39-动态规划
学习·算法·动态规划
I_LPL2 小时前
day23 代码随想录算法训练营 回溯专题2
算法·hot100·回溯算法·求职面试