square(正方形)

poj 2362

题目大意:给出一些数,问你能不能把这些数,分成4堆,没堆的和相等

解决:dfs+回溯,此题用的剪枝稍微少一些就不行

#include <iostream> 

#include <cstring>

#include <algorithm>

#include <cstdio>

#include <functional>

using namespace std;

int num[30],ave,n;



bool found;

bool vis[30];



bool check()

{

    for(int i=0;i<n;i++)if(!vis[i])return false;

    return true;

}



void dfs(int p,int cur_sum,int heap)

{

    if(found)return;

    if(heap==4 && check()){  found=true;  return; }

    for(int i=p;i<n;i++)

    {

        if(!vis[i] && cur_sum+num[i]<=ave )

        {

             vis[i]=1;

             if(cur_sum+num[i]==ave){if(heap+1<=4) dfs(0,0,heap+1);}

             else dfs(i+1,cur_sum+num[i],heap);

             vis[i]=0;

        }

    }

}

int main()

{

    int T;

    scanf("%d",&T);

    while(T--)

    {

        ave=0;

        found=false;

        memset(vis,0,sizeof(vis));

        scanf("%d",&n);

        for(int i=0;i<n;i++){scanf("%d",num+i); ave+=num[i];} 

       //必须被4整除

        if(ave%4)puts("no");

        else

        {

            

            ave/=4;

            //按照从大到小排序

            sort(num,num+n,greater<int>()); 

           //必须所有的都小于平均数

            if(num[0]>ave)puts("no");

            else 

            { 

                dfs(0,0,0);

                if( found )puts("yes");

                else puts("no");

            }

         } 

    }

    system("pause");

    return 0;

}

 

 

你可能感兴趣的:(r)