• 小学生玩ACM----深搜


    Square

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


    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

    #include <iostream>
    #include <algorithm>
    using namespace
    std;
    int
    n,s,k,a[22],visit[22]={0};
    void
    DFS(int sum,int x,int d)
    {

        if
    (
    k||x==3)  //匹配好了三个边就行了,用k标记,并剪枝
        {

            k=1;return;
        }

        int
    i;
        for
    (
    i=d;i<n;i++)  //从d开始,起到剪枝作用,同时避免1-2-3和1-3-2这种重复
        {

            if
    (
    k)return;  //把k插入,剪枝
            if
    (!
    visit[i])
            if
    (
    sum+a[i]==s)  //加上这个长度后正好是一个边
            {

                visit[i]=1;
                DFS(0,x+1,0);
                visit[i]=0;
            }

            else if
    (
    sum+a[i]<s)  //加上这个长度后还不够形成一个边
            {

                visit[i]=1;
                DFS(sum+a[i],x,i+1);
                visit[i]=0;
            }
        }
    }

    bool
    cmp(int a,int b)
    {

        return
    a<b;
    }

    int
    main(void)
    {

        int
    m,i;
        cin>>m;
        while
    (
    m--&&cin>>n)
        {

            for
    (
    i=s=0;i<n;i++)
                cin>>a[i],s+=a[i];
            sort(a,a+n,cmp);
            if
    (
    s%4==0)
            {

                s/=4;
                k=0;
                DFS(0,0,0);  //里面的三个0分别是指当前合成的长度,当前已配好的边数,当前询问到的地点
                if
    (
    k)cout<<"yes"<<endl;
                else
    cout<<"no"<<endl;
            }

            else
    cout<<"no"<<endl;
        }

        return
    0;
    }

    废话就不说了呢,这都还不会深搜那OrzOrz Orz Orz Orz OrzOrz Orz Orz Orz Orz

  • 相关阅读:
    批处理文件双击运行成功,程序调用却运行失败解决方案
    前端安全之加解密种类与HTTPS加密原理(二)
    node包管理nvm与pnpm(一)
    React状态管理—reduxAPI原理分析(三)
    动态规划原理与算法实践(二)
    双指针算法基本原理和实践(一)
    分治算法基本原理和实践(三)
    编程范式(一)
    Java基础
    前端模块化CommonJS、AMD、CMD、ES6模块(二)
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3228507.html
Copyright © 2020-2023  润新知