• hdu1518 Square


    题目链接:

    http://acm.hdu.edu.cn/showproblem.php?pid=1518

    题目为:

    Square

    Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 7839    Accepted Submission(s): 2526


    Problem Description
    Given a set of sticks of various lengths, is it possible to join them end-to-end to form a square?
     

    Input
    The first line of input contains N, the number of test cases. Each test case begins with an integer 4 <= M <= 20, the number of sticks. M integers follow; each gives the length of a stick - an integer between 1 and 10,000.
     

    Output
    For each case, output a line containing "yes" if is is possible to form a square; otherwise output "no".
     

    Sample Input
    3 4 1 1 1 1 5 10 20 30 40 50 8 1 7 2 6 4 4 3 5
     

    Sample Output
    yes no yes
     

    Source
     

    Recommend
    LL   |   We have carefully selected several similar problems for you:  1732 1401 1043 1226 1180
    这个题目是搜索+剪枝优化..分析例如以下:

    这个是给非常多条棒子,然后看用某些棒子能拼成一个正方形。


    我的思路是假设搜索到4组。那么说明能够拼成一根木棒。。
    剪枝的地方是:
    1:假设有4组,那么久不要再搜索了。


    2:为了避免反复,所以用了w这个变量。。。

    代码为:

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int maxn=20+10;
    int a[maxn],vis[maxn];
    int edge,average;
    int t,sum,flag;
    int m;
    void dfs(int pos,int w,int count)
    {
        if(pos==average)
        {
            count++;
            pos=0;
            w=1;
            if(count==4)
            {
                flag=1;
                return;
            }
        }
        if(flag)
            return;
        for(int i=w;i<=m;i++)
        {
           if(vis[i])
             continue;
           else
           {
               if(pos+a[i]<=average)
               {
                   vis[i]=1;
                   dfs(pos+a[i],i+1,count);
                   vis[i]=0;
               }
           }
        }
    
    }
    
    int main()
    {
        scanf("%d",&t);
        while(t--)
        {
            memset(vis,0,sizeof(vis));
            flag=0;
            sum=0;
            scanf("%d",&m);
            for(int j=1;j<=m;j++)
            {
                scanf("%d",&a[j]);
                sum=sum+a[j];
            }
            average=sum/4;
            flag=0;
            if(sum%4!=0||m<4||a[m]>sum/4)
                printf("no
    ");
            else
            {
                dfs(0,1,0);
                if(flag)
                    printf("yes
    ");
                else
                    printf("no
    ");
            }
        }
        return 0;
    }


  • 相关阅读:
    JS实现图片预加载无需等待
    对网页渲染的初步认识
    没人告诉你关于z-index的一些事
    使用CSS3的appearance属性改变元素的外观
    js+css立体旋转
    css3立体旋转动画
    炫酷的jquery瀑布流
    基于jquery的图片懒加载js
    transform应用详解
    css3+js打造炫酷图片展示
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/7019282.html
Copyright © 2020-2023  润新知