hdu 4277

题目链接

 

#include <cstdio> //by-ACMer_xiaohao

#include <cstring>

#include <map>

using namespace std;

#define N 50005 //不知道数组为什么开这么大

map<int,bool> mp[N];

int sum,n,ma[20],ans;

void dfs(int a,int b,int y)

{

    int c=sum-a-b;

    if(a>sum/3||a>c||b>c) return; //判重 把a看做最小的边

    if(y==n)

    {

        if(a>b)

            swap(a,b);

        if(a+b>c)

        {

            if(mp[a].find(b)==mp[a].end()) //找不到返回mp[a].end()

            {

                ans++;

                mp[a][b]=true;

            }



        }

        return;

    }

    dfs(a+ma[y+1],b,y+1);

    dfs(a,b+ma[y+1],y+1);

    dfs(a,b,y+1);

}

int main()

{

    int cas,i,j;

    scanf("%d",&cas);

    while(cas--)

    {

        for(i=0;i<N;i++)

        {

            mp[i].clear();

        }

        sum=0;ans=0;

        scanf("%d",&n);

        for(i=1;i<=n;i++)

        {

            scanf("%d",&ma[i]);

            sum+=ma[i];

        }

        dfs(0,0,0);

        printf("%d\n",ans);

    }

    return 0;



}


 

 

你可能感兴趣的:(HDU)