我试图通过使用递归算法来解决水手,猴子和椰子问题。如果有可能用给定的值解决问题,我希望我的程序声明为true或false。简而言之,问题是有些水手被困在一个有猴子和椰子的岛上。整个晚上,一名水手将醒来,拿着椰子切成均匀的堆,一只椰子留给猴子。然后水手将其中一个桩埋下来,并将另外两个桩堆放在一起。下一个水手醒来,并做同样的事情(为猴子留下一个甚至成堆,埋下其中一个桩,然后放回其他桩)。
我也知道2名水手需要7个椰子,3名水手需要79个椰子,4名水手需要1021个椰子。
我的基础案件有困难。如果我有一个案例,我有4名水手和81个椰子,我的程序会说它可能,因为4%81 = 1。然而,一旦第二个水手在这个例子中对椰子进行分类,就不足以进行排序。
非常感谢任何帮助或建议。非常感谢你!
public class test2 {
public static void main(String[] args) {
int sailors=4, sailorsRemaining=sailors, coconuts=81;
testCoconuts(sailors, sailorsRemaining, coconuts);
}//end main method
public static boolean testCoconuts(int sailors, int sailorsRemaining, int coconutsRemaining){
int s = sailors;
int sr = sailorsRemaining;
int cr = coconutsRemaining;
if (cr%s==1 && sr==0) { //if there are enough coconuts to sort, but no sailors
System.out.println("false1");
return false;
}
else if (cr%s==1 && sr!=0) { //if there are enough coconuts and enough sailors to sort
System.out.print("true1");
return true;
}
if (cr%s!=1) { //if there are not enough coconuts to sort
System.out.println("false2");
return false;
}
else return testCoconuts(s, cr - ((cr-1)/s)-1, sr-1); //recursive step
}
}//end class
答案 0 :(得分:0)
你的方法接受(水手,水手剩余,椰子数),但你的返回方法发送(水手,椰子计数,剩下的水手)。你交换了订单。但仍然无法修复它。我重写了if语句,现在它可以正常工作了。我是通过回答以下问题来做到的:
回答这两个问题,应该轻而易举地完成。调试对我来说是解决问题的关键。
答案 1 :(得分:0)
这个问题和数论有些关系。对于任何数量的水手,都有无数的解决方案。这个想法是找到最小的一个(椰子的数量)。
最终结果是产生一个方程和两个未知数的幂级数。幸运的是,它很容易在视觉上解决,因为两个大组件彼此相对。所以答案归结为以下几点:
满足 N 个水手的解的最小椰子数量是 N(N+1) - (N-1)。
所以对于 3 个椰子 34 = 81 - 2 =79
因此,只需要一种方法来计算该值并适当地返回 true 或 false。
// all the following print true;
System.out.println(check(7,2));
System.out.println(check(79,3));
System.out.println(check(15621,5));
public static boolean check(int coconuts, int sailors) {
return (int)Math.pow(sailors, sailors+1) - (sailors - 1) == coconuts;
}
请注意,这个问题有一个变体,当所有水手聚在一起做最后的划分时,没有余数(即猴子没有得到一个)。在这种情况下,解决方案是 NN - (N-1)。