#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. JS判断不能为空实例代码

    JS判断不能为空实例代码.分享在此. 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" " ...

  2. Spring cloud 两种服务调用方式(Rest + Ribbon) 和 Fegin方式

    1:Rest + Ribbon @Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } @Auto ...

  3. sudo免密码

    很多都是修改/etc/sudoers权限为740再加上一句 ALL=NOPASSWD:ALL 或者加一句 yourname ALL=(ALL) NOPASSWD: ALL 然后权限改回440 先说第一 ...

  4. python selenium 测试环境的搭建及python mysql的连接

    又来一篇傻瓜教程啦,防止在学习的小伙伴们走弯路. 1.python 环境搭建 python官网:https://www.python.org/downloads/  选择最新版本python下载(如果 ...

  5. (K)ubuntu上将分区格式化成NTFS格式

    新买了硬盘,装系统时,为Windows预留了几个分区,由于没有其他选择,因此将分区格式化成了fat32格式.装完系统后,总是很纠结,想把这些分区格式化成NTFS格式. google了一下,从这个网址( ...

  6. Visual Studio 2013 osg

    1>------ Rebuild All started: Project: ZERO_CHECK, Configuration: Debug x64 ------1> Checking ...

  7. 286 walls and gate最近的出口

    [抄题]: 您将获得一个使用这三个可能值初始化的 m×n 2D 网格.-1 - 墙壁或障碍物. 0 - 门. INF - Infinity是一个空房间.我们使用值 2 ^ 31 - 1 = 21474 ...

  8. 基于 EntityFramework 的数据库主从读写分离服务插件

    基于 EntityFramework 的数据库主从读写分离服务插件 1. 版本信息和源码 1.1 版本信息 v1.01 beta(2015-04-07),基于 EF 6.1 开发,支持 EF 6.1 ...

  9. Java设计模式(6)——建造者模式

    定义:Builder模式也叫建造者模式或者生成器模式,Builder模式是一种对象创建型模式之一,用来隐藏复合对象(对象的属性为另一个对象的引用)的创建过程,它把复合对象的创建过程交给Builder, ...

  10. Python之模块和包学习

    模块简介 python是由一系列的模块组成的,每个模块就是一个py为后缀的文件,同时模块也是一个命名空间,从而避免了变量名称冲突的问题.模块我们就可以理解为lib库,如果需要使用某个模块中的函数或对象 ...