zoukankan      html  css  js  c++  java
  • 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;
    }
    

  • 相关阅读:
    学期总结
    C语言I博客作业09
    C语言I博客作业08
    C语言I博客作业07
    C语言I博客作业06
    C语言I博客作业06
    C语言I博客作业05
    C语言I博客作业04
    作业02
    c语言 学习笔记之二 选择题2
  • 原文地址:https://www.cnblogs.com/hpustudent/p/2179995.html
Copyright © 2011-2022 走看看