1.题目描述
一个袋子里面有n个球,每个球上面都有一个号码(拥有相同号码的球是无区别的)。如果一个袋子是幸运的当且仅当所有球的号码的和大于所有球的号码的积。
例如:如果袋子里面的球的号码是{1, 1, 2, 3},这个袋子就是幸运的,因为1 + 1 + 2 + 3 > 1 * 1 * 2 * 3
你可以适当从袋子里移除一些球(可以移除0个,但是别移除完),要使移除后的袋子是幸运的。现在让你编程计算一下你可以获得的多少种不同的幸运的袋子。
2.思路分析
1.对数组进行排序
2.遍历数组,使用递归。当一个袋子号码无法和前面的袋子号码达到要求的时候,后面的袋子号码自然也不会达到要求,直接break。因为号码已经排序了,越往后数值越大,乘积自然也越大。
3.当递归返回的时候,需要回溯,继续计算前面的号码和当前位置后面的号码是否是幸运的。
4.考虑特殊情况,即号码为1.
3.代码
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] a = new int[n];
for(int i = 0; i < n; i++){
a[i] = sc.nextInt();
}
Arrays.sort(a);
int num = med(a, n, 0, 0, 1);
System.out.println(num);
}
public static int med(int[] a, int n, int pos, int sum, int multi){
int count = 0;
for(int i = pos; i < a.length; i++){
sum += a[i];
multi *= a[i];
if(sum > multi){
count = count + 1 + med(a, n, i + 1, sum, multi);
}else if(a[i] == 1){
count = count + med(a, n, i + 1, sum, multi);
}else{
break;
}
sum -= a[i];
multi /= a[i];
while(i < n - 1 && a[i] == a[i + 1]){
i++;
}
}
return count;
}
}