python实现递推算法解决分鱼问题

文章描述了一个涉及数学和算法的问题,5个人合伙捕鱼后轮流分鱼。通过建立数学模型和编写Python程序,确定了至少捕获的鱼的数量以及每个人醒来后看到的鱼的数量。程序使用循环和条件判断找到满足条件的最小鱼数。
摘要由CSDN通过智能技术生成

一、问题描述

A、B、C、D、E5个人合伙夜间捕鱼,凌晨时都已经疲惫不堪,于是各自在河边的树丛中找地方睡着了。第二天日上三竿时,A第一个醒来,他将鱼平分为5份,把多余的一条扔回河中,然后拿着自己的一份回家去了;B第二个醒来,但不知道A已经拿走了一份鱼,于是他将剩下的鱼平分为5份,扔掉多余的一条,然后只拿走了自己的一份;接着C、D、E依次醒来,也都按同样的办法分鱼。问这5个人至少合伙捕到多少条鱼?每个人醒来后所看到的鱼是多少条?

二、问题分析

假设E分鱼前鱼的总数为6条、11条、16条……则对应E的每次取值都可以将其他4个人分鱼前鱼的总数递推出来。每个人分鱼前,鱼的总数%5都必须为1,且B、C、D、E分鱼前鱼的总数%4必须为0,即每次剩余的鱼必须能够均分成4份

三、算法设计

定义数组fish[6]来保存每个人分鱼前鱼的总条数,A、B、C、D、E分鱼前鱼的总条数分别存放在fish数组下标为1、2、3、4、5的元素中。相邻两人看到的鱼的条数存在如下关系:

fish[1]=全部的鱼
fish[2]=(fish[1]-1) // 5 * 4
fish[3]=(fish[2]-1) // 5 * 4
fish[4]=(fish[3]-1) // 5 * 4
fish[5]=(fish[4]-1) // 5 * 4

得到表达式:

fish[n]=(fish[n-1]-1) // 5 * 4

则:

fish[n-1]=fish[n]*5 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值