我需要用Java编写一个称为“ OneFiveSeven”的递归方法,该方法接收一个整数(0 <= n)并返回最小的加数,以便将(int n)表示为一个,五个和七的。 例如:oneFiveSeven(10)= 2、5 + 5。
public static int oneFiveSeven(int n){
if(n < 5){
return n;
}
if(n == 5){
return 1;
}
if(n == 7){
return 1;
}
if( n % 7 + n / 7 < n % 5 + n / 5){
return 1 + oneFiveSeven(n - 7);
}
return 1 + oneFiveSeven(n -5);
}
我不确定我的代码是否正确...您怎么看? (不是在寻找最佳的复杂性)
答案 0 :(得分:0)
您的代码对我来说正确。
这是您的解决方案的简单(但较慢)的递归版本:
public static int oneFiveSeven(int n){
if(n < 5) return n;
if(n == 5) return 1;
if(n == 6) return 2;
if(n == 7) return 1;
return Math.min(1 + oneFiveSeven(n - 7), 1 + oneFiveSeven(n - 5));
}
您可以利用动态编程为每个值存储最佳可能性:
public class Main{
public static int[] dp = new int[1000];
public static void initDp(){
dp[0] = 0; dp[1] = 1; dp[2] = 2; dp[3] = 3;
dp[4] = 4; dp[5] = 1; dp[6] = 2; dp[7] = 1;
for(int i = 8; i < 1000; i++) dp[i] = -1;
}
public static int oneFiveSeven(int n){
if(dp[n] != -1) return dp[n];
dp[n] = Math.min(1 + oneFiveSeven(n - 7), 1 + oneFiveSeven(n - 5));
return dp[n];
}
public static void main(String[] args) {
initDp();
System.out.println(oneFiveSeven(10));
System.out.println(oneFiveSeven(100));
System.out.println(oneFiveSeven(999));
}
}
输出
2
16
143