【发布时间】:2020-12-20 07:11:30
【问题描述】:
我正在尝试从多个数组列表中选择一个数字,并找到所有可能的方法来选择这些数字,以使这些数字的总和大于给定的数字。我只能想到蛮力实现。
例如,我有五个数组列表,例如
A = [2, 6, 7]
B = [6, 9]
C = [4]
D = [4, 7]
E = [8, 10, 15]
给定的数字是 40。 然后从每个列表中选择一个数字后,所有可能的方法都可以是
[7, 9, 4, 7, 15]
[6, 9, 4, 7, 15]
因此,这是选择大于或等于 40 的数字的两种可能方法。如果给定的数字很小,那么可能有很多解决方案。那么我如何在没有蛮力的情况下计算它们呢?即使使用蛮力,我如何在 Java 中设计解决方案。
以下是我的实现。它适用于小数字,但如果数字很大,则会出现运行时错误,因为程序运行时间过长。
public static void numberOfWays(List<Integer> A, List<Integer> B, List<Integer> C, List<Integer> D,
List<Integer> E, int k){
long ways = 0;
for(Integer a:A){
for(Integer b:B){
for(Integer c:C){
for(Integer d:D){
for(Integer e:E){
int sum = a+b+c+d+e;
//System.out.println(a+" "+b+" "+c+" "+d+" "+e+" "+sum);
if(sum > k)
ways++;
}
}
}
}
}
System.out.println(ways);
}
列表最多可以包含1000个元素,元素的范围可以从1到1000。阈值k的范围可以从1到10^9。
【问题讨论】:
-
你在哪里解决这个问题?
-
我已经添加了我尝试的实现。你能重新打开我的问题吗?
-
提示:使用递归。
-
即使我使用递归,步数不会保持不变吗?我不能跳过一个数字,即使它远小于阈值 k,因为在另一个列表中可能有一个更大的数字可以使总和超过阈值。
-
这个问题还能再开吗?