void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

给出一堆木棒,是否能组成一个正方形

首先相加/4 是否是整数,不是的话直接输出no,其次看每个数,如果有大于aver的依然break掉输出no

然后把木棒从大到小排序

 dfs(index,sum,num)index 从当前的数组下标开始往后dfs,sum当前已经加到的和,num是当前已经搜到边数

#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int aver,flag,n,a[30],visited[30]={0};
int cmp(int x,int y)
{    return x>y;}
void dfs(int index,int sum,int num)
{
    if(num==3){flag=1;return ;}
    //if(sum==aver){dfs(0,0,num+1);return }
    for(int i=index;i<n;i++)
    {
        if(sum+a[i]<=aver&&!visited[i])
        {
            visited[i]=1;
           if(sum+a[i]<aver) dfs(i+1,sum+a[i],num);
           else dfs(0,0,num+1);
            visited[i]=0;
        }
    }
    
}
int main()
{     
    int ca;    
    scanf("%d",&ca);    
    while(ca--)    
    {       
        int i,t=0;       
        scanf("%d",&n);       
        for(i=0;i<n;i++)       
        {          
            scanf("%d",&a[i]); 
            visited[i]=0;         
            t=t+a[i];       
        }       
        if(t%4!=0)       
        {          
            printf("no\n");          
            continue;       
        }       
        aver=t/4;       
        for(i=0;i<n;i++)       
        if(a[i]>aver)break;       
        if(i<n)       
        {          
            printf("no\n");          
            continue;       
        }       
        sort(a,a+n,cmp);       
        flag=0;       
        dfs(0,0,0);       
        if(flag==0) printf("no\n");       
        else  printf("yes\n");    
        }}
posted on 2011-05-13 20:07  void-man  阅读(256)  评论(0)    收藏  举报