题解 | #幸运的袋子#
幸运的袋子
https://www.nowcoder.com/practice/a5190a7c3ec045ce9273beebdfe029ee
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
//幸运的袋子
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextInt()){
int n = scanner.nextInt();
int[] arr = new int[n];
for (int i = 0; i < arr.length; i++) {
arr[i] = scanner.nextInt();
}
//用数组存储好每个球的大小
//对数组进行排序,减小计算次数
Arrays.sort(arr);
System.out.println(count(arr, n, 0, 0, 1));
}
}
//递归求幸运袋子数,参数,开始位置,sum,muty值,
public static int count(int[] a,int n,int pos,int sum,int muty){
int count =0;
//遍历求和求积
for (int i = pos; i < n; i++) {
sum+=a[i];
muty*=a[i];
if (sum>muty){
//递归求下一层,开始位置加一
count = count+1 + count(a,n,i+1,sum,muty);
}else if(a[i]==1){
//当等于1时,说明后面的也有可能是幸运的袋子
count = count+count(a,n,i+1,sum,muty);
}else if (sum<=muty){
//此时说明不是幸运的袋子,由于排序了,
// 所以后面的球数也不可能,结束进行回溯
break;
}
sum = sum-a[i];
muty /=a[i];
//如果是相同的球号就跳过
while (i <n-1&&a[i]==a[i+1]){
i++;
}
}
return count;
}
}
