算法-经典趣题-渔夫捕鱼

一、问题

渔夫捕鱼问题是一个典型的递推问题,渔夫捕鱼问题的大意如下:

某天晚上,A、B、C、D、E 5个渔夫合伙捕鱼,捕到一定数量之后便停止捕鱼,各自到岸边休息。第二天早晨,渔夫A第一个醒来,他将鱼分作5份,把多余的一条扔回河中,拿其中自己的一份回家去了。渔夫B第二个醒来,也将鱼分作5份,扔掉多余的一条,拿走自己的一份。渔夫C第三个醒来,也将鱼分作5份,扔掉多余的一条,拿走自己的一份。渔夫D第四个醒来,也将鱼分作5份,扔掉多余的一条,拿走自己的一份。渔夫E第五个醒来,也将鱼分作5份,扔掉多余的一条,拿走自己的一份。问5个渔夫至少捕到多少条鱼呢?

二、问题分析

先来分析一下渔夫捕鱼问题。这里,每个渔夫醒来的时候,鱼的数量都应该是5的倍数再加1。为了保证所有的渔夫都可以按照上述方法来分鱼。

那么最后一个渔夫E醒来之后,鱼的数量至少应该为6。在他扔掉一条鱼之后,仍然可以平均分为5份。

那么渔夫D醒来的时候,鱼的数量应该为6×5+1=31;

渔夫C醒来的时候,鱼的数量应该为31×5+1=156;

渔夫B醒来的时候,鱼的数量应该为156×5+1=781;

渔夫A醒来的时候,鱼的数量应该为781×5+1=3906;

这是一个明显的递推的式子,递推公式如下:

Sn-1=5Sn+1

三、编程

package com.joshua317;

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
	// write your code here
        int yufa, total;
        System.out.println("渔夫捕鱼问题");
        Fish fish = new Fish();
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入渔夫数量:");
        yufa = scanner.nextInt();
        total = fish.totalFish(yufa);

        System.out.printf("%d个渔夫至少合伙捕鱼数量为%d", yufa, total);

    }
}

class Fish {
    public int totalFish(int yufu) {
        int init;//定义一个初始变量
        int i;//循环的次数
        int total;//捕鱼的总数
        init = yufu + 1;
        i = yufu - 1;
        total = init;
        while (i != 0) {
            total = 5 * total + 1;
            i--;
        }

        return total;
    }
}



 
原文地址:https://www.cnblogs.com/joshua317/p/15221687.html