#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int len[20],sum,M;
bool flag,f[20];//flag标记是否找到
void dfs(int d,int stick,int nowlen)
{
    //i:正在处理的小棍,stick:已经拼好的边框数,nowlen:当前正在拼的框的长度
    int j;
    if(flag||stick>2)
	{
        if(stick>2)
			flag=1;//已经拼好3个框,第四个不用拼了
        return ;
    }
    else
	{
        for(j=d;j<M;j++)
		{
            if((!f[j])&&nowlen+len[j]<=sum)
			{
                f[j]=1;//标记
                if(nowlen+len[j]==sum)
					dfs(0,stick+1,0);//拼好了一个,继续拼下一个
                else
					dfs(j+1,stick,nowlen+len[j]);//继续拼当前的
                f[j]=0;//恢复标记
            }
        }
    }
}
int main()
{
    int ca,i,j;
    scanf("%d",&ca);
    while(ca--)
	{
        scanf("%d",&M);
        for(i=sum=0;i<M;i++)
		{
            scanf("%d",&len[i]);
            sum+=len[i];
        }
        if(sum%4!=0)
		{
			printf("no\n");
			continue;
		}
        sum/=4;
        for(int i=0;i<M;i++)
			for(int j=i+1;j<M;j++)
			{
				if(len[i]<len[j])
				{
					int t=len[i];
					len[i]=len[j];
					len[j]=t;
				}
			}
        if(len[0]>sum)
		{
			printf("no\n");
			continue;
		}
        flag=0;
        dfs(0,0,0);
        printf("%s\n",flag?"yes":"no");
    }
    //system("pause");
    return 0;
}

  

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

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.

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

Sample Input

3
#include <stdio.h>
int a[20];
int sum=0;
int b[20]={0};
int n;
int flag=0;
void fun(int step,int num,int toile)
{
	if(num>2)
	{
		flag=1;
	}

	for(int i=step;i<n;i++)
	{
		if((!b[i])&&(toile+a[i]<=sum))
		{
			b[i]=1;
			if(toile+a[i]==sum)
			{
				fun(0,num+1,0);
			}
			else
			{
				fun(i+1,num,toile+a[i]);
			}

			b[i]=0;

		}
	}
}
int main()
{
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
		sum=sum+a[i];
	}

	if(sum%4==0)
	{
		sum=sum/4;
		fun(0,0,0);
	}

	else
	{
		printf("NO");
	}
	if(flag==1)
		printf("YES");
	return 1;
}
#include <stdio.h> int a[20]; int sum=0; int b[20]={0}; int n; int flag=0; void fun(int step,int num,int toile) { if(num>2) { flag=1; } for(int i=step;i<n;i++) { if((!b[i])&&(toile+a[i]<=sum)) { b[i]=1; if(toile+a[i]==sum) { fun(0,num+1,0); } else { fun(i+1,num,toile+a[i]); } b[i]=0; } } } int main() { scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&a[i]); sum=sum+a[i]; } //先排序 for(int i=0;i<n;i++) for(int j=i+1;j<n;j++) { if(a[i]>a[j]) { int t=a[i]; a[i]=a[j]; a[j]=t; } } if(sum%4==0) { sum=sum/4; fun(0,0,0); } else { printf("NO"); } if(flag==1) printf("YES"); return 1; }
4 1 1 1 1 5 10 20 30 40 50 8 1 7 2 6 4 4 3 5

Output for Sample Input

yes
no
yes

TOJ1398正方形的编成 或者 POJ2362的更多相关文章

  1. poj2362 Square(DFS)

    题目链接 http://poj.org/problem?id=2362 题意 输入n根棍子的长度,求这n根棍子是否能组成一个正方形. 思路 假设能组成正方形,则正方形的周长为sum,sum/4为正方形 ...

  2. [LeetCode] Matchsticks to Square 火柴棍组成正方形

    Remember the story of Little Match Girl? By now, you know exactly what matchsticks the little match ...

  3. [LeetCode] Maximal Square 最大正方形

    Given a 2D binary matrix filled with 0's and 1's, find the largest square containing all 1's and ret ...

  4. 【纯css】左图右文列表,左图外框宽度占一定百分比的正方形,右上下固定,右中自动响应高度。支持不规则图片。

    查看演示 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF- ...

  5. BZOJ1047: [HAOI2007]理想的正方形 [单调队列]

    1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2857  Solved: 1560[Submit][St ...

  6. 洛谷 P1387 最大正方形 Label:奇怪的解法

    题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=100),接下来n行,每行m ...

  7. H5一行显示两个正方形

    1)有时候一些图片会是正方形或者长方形,对于这样的图片一般都是居中显示到正方体内,代码如下:  .exhibition_list img{width:100%;position: relative;t ...

  8. 求解最大正方形面积 — leetcode 221. Maximal Square

    本来也想像园友一样,写一篇总结告别 2015,或者说告别即将过去的羊年,但是过去一年发生的事情,实在是出乎平常人的想象,也不具有代表性,于是计划在今年 6 月份写一篇 "半年总结" ...

  9. for 循环 正方形

    <?php//================================正方形//for($q = 1; $q <= 5; $q ++ ){//    for($z =1; $z & ...

随机推荐

  1. 下拉菜单的实现classList.add() classList.remove() class属性的添加和删除

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 实战zabbix3.0.2 使用percona mysql插件监控mysql5.7

    1.系统环境 [root@shard0 templates]# cat /etc/redhat-release Red Hat Enterprise Linux Server release 7.2 ...

  3. django中文件下载(HttpResponse)

    最近一个用django开发的web项目要进行数据的导入导出,所以有必要了解下. django中主要用HttpResponse将请求结果返回给浏览器,所以文件的下载也是通过改对象进行处理的,具体的一个列 ...

  4. 38-解决Fiddler查看Post参数中文乱码的问题

    转载自:https://blog.csdn.net/JusterDu/article/details/50888617 解决Fiddler查看Post参数中文乱码的问题 2016年03月14日 18: ...

  5. Castle ActiveRecord学习(七)使用日志

    暂无 参考:http://terrylee.cnblogs.com/archive/2006/04/14/374829.html

  6. chrome扩展安装图文教程

    众所周知chrome的各类插件,扩展很丰富,也有很多经典的应用.但是谷歌经常被墙,无法访问,想要通过访问谷歌的应用市场来直接安装浏览器扩展会比较让人抓狂,好不容易无数次刷新后打开了页面,找到了想要的应 ...

  7. 06 Python字符编码与文件处理

    python垃圾回收机制: python中的垃圾回收机制是以引用计数为主,分代收集为辅,引用计数的缺陷是循环引用的问题,一个对象的引用数为0 ,那么这个对象就会被python虚拟机回收内存 字符编码 ...

  8. 使用windows server2012时FileZilla客户端连接时报150 Opening data channel for directory listing of "/" 响应:425 Can't open data connection

    425 Can't open data connection 和 读取目录列表失败 问题解决 这个问题主要是由于使用Passive Mode模式造成的,解决这个问题很简单: 1.在ftp服务软件中设置 ...

  9. HDU 6214 Smallest Minimum Cut (最小割且边数最少)

    题意:给定上一个有向图,求 s - t 的最小割且边数最少. 析:设边的容量是w,边数为m,只要把每边打容量变成 w * (m+1) + 1,然后跑一个最大流,最大流%(m+1),就是答案. 代码如下 ...

  10. CodeForces 687A NP-Hard Problem (二分图)

    题意:给定 n 条边,然后让你把它分成两组,每组都有所有边的一个端点. 析:一开始我是先判定环,以为就不能成立,其实不是这样的,有环也行.用dfs进行搜索,并标记每一个端点,如果标记过并且和以前不一样 ...