一個袋子里面有n個球,每個球上面都有一個號碼(擁有相同號碼的球是無區別的)。如果一個袋子是幸運的當且僅當所有球的號碼的和大於所有球的號碼的積。 例如:如果袋子里面的球的號碼是{1, 1, 2, 3},這個袋子就是幸運的,因為1 + 1 + 2 + 3 > 1 * 1 * 2 * 3 你可以適當從袋子里移除一些球(可以移除0個,但是別移除完),要使移除后的袋子是幸運的。現在讓你編程計算一下你可以獲得


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

采用dfs遍歷,符合條件就向下遍歷,其實還是有點不太理解

#include<iostream>
#include<algorithm>
using namespace std;
const int N=1000;
int a[N];
int n;

int getnum(int a[],int pos,long sum,long multi)
{
    int cnt=0;
    for(int i=pos;i<n;i++)
    {
        sum+=a[i];
        multi*=a[i];
        if(sum>multi)
            cnt+=1+getnum(a,i+1,sum,multi);
        else if(a[i]==1)
            cnt+=getnum(a,i+1,sum,multi);
        else
            break;
        sum=sum-a[i];
        multi=multi/a[i];
        for(;i<n-1&&a[i]==a[i+1];i++);
    }
    return cnt;
}
int main()
    {
    while(scanf("%d",&n)>0)
    {
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        sort(a,a+n);
        cout<<getnum(a,0,0,1);
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM