DFS+回溯

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35747066/article/details/89298242

题目描述

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

输入描述:

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

输出描述:

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

示例1

输入

3
1 1 1

输出

2
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int DFS(const vector<int>& Array,int sum,int mult,int StartIndex){
    int Result = 0;
    for(int i = StartIndex;i < Array.size();i ++){
        sum += Array[i];
        mult *= Array[i];
        if(sum > mult){
            Result += 1 + DFS(Array,sum,mult,i + 1);
        }
        else if(Array[i] == 1){
            Result += DFS(Array,sum,mult,i + 1);
        }
        else{
            break;
        }
        sum -= Array[i];
        mult /= Array[i];
        for(;i < Array.size() - 1 && Array[i] == Array[i + 1];i++){}
    }
    return Result;
}
int main(){
    int n;vector<int> Array;
    scanf("%d",&n);
    for(int i = 0;i < n;i ++){
        int tmp;
        scanf("%d",&tmp);
        Array.push_back(tmp);
    }
    sort(Array.begin(),Array.end());
    int Result = DFS(Array,0,1,0);
    printf("%d\n",Result);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_35747066/article/details/89298242