赞
踩
递归(分鱼问题)
A、B、C、D、E这5个人合伙夜间捕鱼,凌晨时都已经疲惫不堪,于是各自在河边的树丛中找地方睡着了。第二天日上三竿时,A第一个醒来,他将鱼平分为5份,把多余的一条扔回河中,然后拿着自己的一份回家去了;B第二个醒来,但不知道A已经拿走了一份鱼,于是他将剩下的鱼平分为5份,扔掉多余的一条,然后只拿走了自己的一份;接着C、D、E依次醒来,也都按同样的办法分鱼。问这5人至少合伙捕到多少条鱼?每个人醒来后所看到的鱼是多少条?
分析
假设五个人捕鱼,一共捕到x条鱼。
第一个人完成操作后,剩余4*(x-1)/5
第二个人,第三个继续操作。且每次操作都必须保证(操作前的鱼数-1)mod 5=0;设每次操作前的数量为Xn(n=1,2,3,4,5)那么,第一次操作前为X1(X)
X2=4(X1-1)/5
X3=4(X2-1)/5
X4=4(X3-1)/5
X5=4(X4-1)/5
由此看出最适合进行递归操作
且如果规定了任意一个数的值,那么必然能推算出每一个数的值。同时Xn应该满足(Xn-1) mod 5= 0;
由此可知比较脑瘫的算法就是给定一个值(这个起始值应该是满足(Xn-1) mod 5=0 的最小数也就是6)对这个值进行检查,不满足条件就自增5直至检查通过位置,可以使用do—while循环
//完整的代码(分鱼问题) #include <stdio.h> int jiancha(int n,int t)//n表示此次操作的次数(n取1....5,从1开始自增至5,t表示此时的鱼的数量即Xn) {if((t-1)%5 == 0){ if(n == 5) return 1;//递归出口 else return jiancha(n+1,4*(t-1)/5);}//递归调用函数*这里有一点疑惑就是当把n+1改为n++的时候在dev中无法正常运行代码,最后结果没有输出,求大佬帮忙* return 0;//不满足条件的递归出口 } int main() { int i=1; int x=i*5+1; int flag=0;//当满足条件的时候flag=1用于跳出do——while的循环 do { i++; x=i*5+1; if(jiancha(1,x)){ flag=1; printf("这五个人一共抓到%d条鱼",x);} }while(!flag); return 0; }
时间复杂度我还不知道是什么,私以为与递归的次数会有关系即O(n),空间复杂度O(1)//不知道对不对
也是第一次写博客,望大佬指出改正的地方
这个题我还没有想出更好的算法
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。