dfs+避免重複-幸運的袋子(網易題)

一個袋子裏面有n個球,每個球上面都有一個號碼(擁有相同號碼的球是無區別的)。如果一個袋子是幸運的當且僅當所有球的號碼的和大於所有球的號碼的積。
例如:如果袋子裏面的球的號碼是{1, 1, 2, 3},這個袋子就是幸運的,因爲1 + 1 + 2 + 3 > 1 * 1 * 2 * 3
你可以適當從袋子裏移除一些球(可以移除0個,但是別移除完),要使移除後的袋子是幸運的。現在讓你編程計算一下你可以獲得的多少種不同的幸運的袋子。 
輸入描述:
第一行輸入一個正整數n(n ≤ 1000)
第二行爲n個數正整數xi(xi ≤ 1000)


輸出描述:
輸出可以產生的幸運的袋子數

輸入例子:
3
1 1 1

輸出例子:
2


import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[] a=new int[n];
        for(int i=0;i<n;i++) a[i]=in.nextInt();

        Arrays.sort(a); 
        System.out.println(dfs(a,0,0,1));
    }

    public static int dfs(int[]a, int curIndex, int sum, int product){
        int count=0;
        for(int i=curIndex;i<a.length;i++){
            sum+=a[i]; product*=a[i];
            if(sum>product) count+=1+dfs(a, i+1, sum, product);  
            else if(a[i]==1) count+=dfs(a, i+1, sum,product); 
            else break;  
            sum-=a[i]; product/=a[i];  
            for(;i<a.length-1&&a[i]==a[i+1];i++) ;
        }
        return count;
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章