幸运的袋子(深度优先遍历)

Posted 千彧

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了幸运的袋子(深度优先遍历)相关的知识,希望对你有一定的参考价值。

题目描述

一个袋子里面有n个球,每个球上面都有一个号码(拥有相同号码的球是无区别的)。如果一个袋子是幸运的当且仅当所有球的号码的和大于所有球的号码的积。
例如:如果袋子里面的球的号码是{1, 1, 2, 3},这个袋子就是幸运的,因为1 + 1 + 2 + 3 > 1 * 1 * 2 * 3
你可以适当从袋子里移除一些球(可以移除0个,但是别移除完),要使移除后的袋子是幸运的。现在让你编程计算一下你可以获得的多少种不同的幸运的袋子。

输入描述:

第一行输入一个正整数n(n ≤ 1000)
第二行为n个数正整数x
i
(x
i
≤ 1000)

输出描述:

输出可以产生的幸运的袋子数
示例1

输入

3
1 1 1

输出

2
 1 /**
 2  * 幸运的袋子
 3       1、对于a+b>a*b 必然有 一个数为1
 4  * @author Dell
 5  *
 6  */
 7 
 8 import java.util.ArrayList;
 9 import java.util.Arrays;
10 import java.util.HashSet;
11 import java.util.List;
12 import java.util.Scanner;
13 import java.util.Set;
14 
15 public class Main {
16 
17     static public int dfs(int a[], int index, long sum, long multi) {
18         int count = 0;
19         for (int i = index; i < a.length; i++) {
20             sum += a[i];
21             multi *= a[i];
22 
23             if (sum > multi) {// 目前幸运接着递归
24                 count = count + 1 + dfs(a, i + 1, sum, multi);
25             } else if (a[i] == 1) { // a[i] = 1  还有机会
26                 count = count + dfs(a, i + 1, sum, multi);
27             } else {// 不幸运  退出
28                 break;
29             }
30 
31             sum -= a[i];
32             multi /= a[i];
33             for (; i < a.length - 1 && a[i] == a[i + 1]; i++) {
34                 // 相同号码 球取哪个 无区别 跳过
35             }
36         }
37         return count;
38     }
39     public static void main(String[] args) {
40         Scanner sc =new Scanner(System.in);
41         while(sc.hasNext()) {
42             int n = sc.nextInt();
43             int []a = new int[n];
44             for (int i = 0; i < a.length; i++) {
45                 a[i] = sc.nextInt();
46             }
47             Arrays.sort(a);
48             System.out.println(dfs(a,0,0,1));
49         }
50     }
51 
52 }

 

以上是关于幸运的袋子(深度优先遍历)的主要内容,如果未能解决你的问题,请参考以下文章

幸运的袋子 --- 回溯法

数据结构—深度优先遍历广度优先遍历图遍历算法的应用

求图的深度优先遍历程序 c语言版

深度优先图遍历

数据结构 深度优先遍历

回溯算法之幸运的袋子