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; } }