我想找出一种方法,从n
整数中找出x
整数的最大和。
在这种情况下,输入总是5
整数的数组,任务是使用4
数字(每个数字只能使用一次)计算最大可能的和。
以下是我到目前为止提出的方法,但我不知道如何用一种方法来完成这一切。
public static int maxSum(int[] numbers, int i) {
return sum(numbers, i) - min(numbers, i);
}
public static int sum(int[] numbers, int i) {
if (i == 1) return numbers[0];
return numbers[i - 1] + sum(numbers, i - 1);
}
public static int min(int[] numbers, int i) {
if (i == 1) return numbers[0];
return Math.min(numbers[i - 1], min(numbers, i - 1));
}
有了这个输入:int[]arr={1, 2, 3, 4, 5};
程序应该打印出14
。
为了创建递归实现,首先,您需要对递归的工作原理有一个明确的了解。
每个递归方法由两部分组成:
解决这个问题的最简单方法是跟踪数组中的位置(在下面的代码中表示为pos
),并在每次方法调用时递增它。
这个问题的基本情况是,当x==0
或当位置命中大于给定数组中最后一个有效索引的索引时。也就是说,在这两种情况下,总和都没有数字可加。因此,html" target="_blank">返回值将为0
。
递归案例代表两种可能性:
在这两种情况下,当递归调用方法时,位置需要增加1
。
当从客户端代码调用方法(第一个方法调用)时,我们需要传递00
作为起始位置。
public static int getMaxSum(int[] arr, int pos, int elements) {
if (elements == 0 || pos == arr.length) { // base case: no elements left to add or index is invalid
return 0;
}
// two possibilities: add or ignore the current element
int take = arr[pos] + getMaxSum(arr, pos + 1, elements - 1);
int discard = getMaxSum(arr, pos + 1, elements);
return Math.max(take, discard);
}
main()
-demo
public static void main(String[] args) {
System.out.println(getMaxSum(new int[]{8, 1, 3, 5, 9}, 0, 4));
System.out.println(getMaxSum(new int[]{1, 2, 3, 4, 5}, 0, 4));
}
输出
25
14
我试着写一个代码,它接受一个介于1和1_000_000之间的整数,并返回一个比相同数字的整数大的最小整数,如果它不存在,则打印0。 举个例子 输入:156 输出165 输入330 输出0 输入27711 输出71127 我的问题是,下面的代码没有为其他输入返回正确的输出。 例如,在输入4231中,输出应该是4312。 我很难找到为每个输入返回正确输出的最佳算法。 TNX提前 }
我只能想到一个朴素的算法,它列出集合的所有子集,并检查子集的和是否和是否最小,但它是一个指数算法,列出所有子集需要O(2^n)。我能用动态规划在多项式时间内求解吗?
本文向大家介绍C ++中给定乘积的N个整数的最大GCD,包括了C ++中给定乘积的N个整数的最大GCD的使用技巧和注意事项,需要的朋友参考一下 假设我们有两个整数N和P。P是N个未知整数的乘积。我们必须找到这些整数的最大可能GCD。假设N = 3,且P = 24,则不同的组将像{1,1,24},{1,2,12},{1,3,8},{1,4,6},{2 ,2,6},{2,3,4}。GCD为:1、1、1
我试图创建一个递归函数,查找数组中低整数和高整数之间的最大数字。 我尝试了这个函数,它可以帮助递归地查找数组中的最大元素。我只是不知道如何向函数中添加一个低整数和一个高整数,以找到这两个整数之间的最大值。 目标是有一个看起来像这样的函数:
问题内容: 对于需要解决的问题之一,我使用for循环找到了数组的最大值,因此我尝试使用递归找到它,这就是我想出的: 因此它可以正常工作并获取最大值,但是我的问题是:对于基本情况,返回a [head]以及对于在开头处的值大于最后一个值的情况,可以吗? 问题答案: 您只需一个计数器即可轻松完成此操作,只需使用您这次想要比较的值的索引即可: 这样可以更好地显示正在发生的情况,并使用默认的“递归”布局,例
LIS:最长递增子序列问题是寻找给定序列的子序列,其中子序列的元素按从低到高的顺序排序 例如: 0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15 此算法是否? 你能解释一下吗?