// 对存放球中的号码数组进行排序 // 如果前面的号码 和<积, 后面的就不用计算都小于; // 如果不满足条件,进行数组回溯,判断当前号码前面的号码与当前号码后面的和,积进行判断判断 // 考虑特殊情况arr[i] == 1; import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNext()) { int n = in.nextInt(); int[] arr = new int[n]; for(int i = 0; i < n; i++) { arr[i] = in.nextInt(); } Arrays.sort(arr); int num = counter(arr,n,0,0,1); System.out.println(num); } } public static int counter(int[] arr,int n,int start,int sum,int mul) { int count = 0; for(int i = start; i < n; i++) { sum += arr[i]; mul *= arr[i]; if(sum > mul) { //使用递归向后比较 count = count + 1 + counter(arr,n,i+1,sum,mul); //1 与任何数的和大于积; //1 + 2 > 1 * 2; 如果等于1 直接比较后面的数 } else if(arr[i] == 1) { count = counter(arr,n,i+1,sum,mul); } else { break; } //回溯,前面的号码与当前号码后面的在进行比较 sum -= arr[i]; mul /= arr[i]; //去重 while(i+1 < n && arr[i] == arr[i+1]) { i++; } } return count; } }