zoukankan      html  css  js  c++  java
  • HDU 1518 Square

    Square

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

    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
     
    思路:DFS
     
    代码:
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    int map[100];
    int n,m;
    int used[100];
    int sum;
    int side;
    int flag;
    int mmm;
    void DFS(int now,int cnt,int k)
    {
        if(now == side)
        {
            cnt ++;
            now = 0;
            k = 0;
        }
        if(cnt == 4)
        {
            flag = 1;
            return ;
        }
        for(int i = k;i <= m;i ++)
        {
            if(!used[i])
            {
                used[i] = 1;
                if(now + map[i] <= side)
                {
                    DFS(now + map[i],cnt,i + 1);
                    if(flag)
                       return ;
                }
                used[i] = 0;
            }
        }
    }
    int main()
    {
        scanf("%d",&n);
        while(n --)
        {
            scanf("%d",&m);
            sum = 0;
            mmm = 0;
            flag = 0;
            for(int i = 1;i <= m;i ++)
            {
                  scanf("%d",&map[i]);
                  if(mmm < map[i])
                      mmm = map[i];
                  sum += map[i];
            }
            if(sum % 4 != 0 || mmm > sum / 4)
            {
                flag = 0;
            }
            else
            {
                side = sum / 4;
                memset(used,0,sizeof(used));
                DFS(0,0,0);
            }
            if(flag == 1)
               printf("yes ");
            else
               printf("no ");
        }
        return 0;
    }
           
           
  • 相关阅读:
    面试(转)
    Expression Blend实战开发技巧
    Twelve Principles of Agile Software
    Test Software Engineer
    Web开发工程师必读的15个设计博客
    麻省理工的C/C++的课程
    Orchard:处理1对多的关系
    DotNetNuke Switches to C# !!
    我的那个他
    2011 微软MVP全球大会
  • 原文地址:https://www.cnblogs.com/GODLIKEING/p/3292730.html
Copyright © 2011-2022 走看看