poj2362 Square DFS剪枝

HDU1518 & POJ2362 & ZOJ1909 Square(DFS,剪枝是关键呀) Square Time Limit : 10000/5000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 9   Accepted Submission(s) : 4 Problem Description Given a set of sticks of v 阅读详情

Square
Time Limit: 3000MS Memory Limit: 65536K
Total Submissions: 22779 Accepted: 7894

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 <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

int M, a[100], tem, sum;
bool vis[100], flag;

void dfs(int n, int pos, int cou) {
	if (n != 0) {
		//没有组成一边
		//注意flag,如果已经组成正方形就没必要继续了
		for (int i = pos; !flag && i < M && a[i] <= n; i++) {
			if (!vis[i]) {
				vis[i] = true;
				dfs(n - a[i], i + 1, cou);  //继续往大搜索 
				vis[i] = false;
			}
		}
	} else {
		//组成一边
		if (cou == 4) {
			flag = true;
		} else {
			dfs(tem, 0, cou + 1);
		}
	}	
}

int main()
{
	int N;
	scanf("%d", &N);
	while(N--) {
		memset(vis, false, sizeof(vis));
		scanf("%d", &M);
		sum = 0;
		int maxn = -1;
		for (int i = 0; i < M; i++) {
			scanf("%d", &a[i]);
			sum += a[i];
			maxn = max(a[i], maxn);
		}
		
		if (sum % 4 != 0) {
			puts("no");
			continue;
		}
		
		tem = sum / 4;
		
		//如果最大的边比正方形的边大
		//一定组不成 
		if (maxn > tem) {
			puts("no");
			continue;
		}
		
		//对边排好序,在DFS的时候 
		sort(a, a + M);
		
		flag = false;
		
		dfs(tem, 0, 1); //分别找4条边 
		if (flag) {
			puts("yes");
		} else {
			puts("no");
		}
	}
	return 0;
}


另一种等价写法,但是递归边界有所不同,递归一定要看清楚入口处的状态是什么,是完成了还是待完成的,每个变量对应的状态的准确含义是什么一定要

搞清楚



#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

int N, s[30], tem;
bool vis[30];

bool dfs(int pos, int ans, int cou) {
	///注意dfs状态,dfs(pos, ans, cou)
	///其中cou表示“已完成”cou个,ans是组边时“已完成”的和,pos是“待计算”的位置
	if (cou == 4) return true;
	if (ans != tem) {
		for (int i = pos; i < N && ans + s[i] <= tem; i++) {
			if (!vis[i]) {
				vis[i] = true;
				if (dfs(i + 1, ans + s[i], cou)) {
					return true;
				}
				vis[i] = false;
			}
		}
	}
	else {
		//if (cou == 4) return true;
		if (dfs(0, 0, cou + 1))
			return true;
	}
	return false;
}

int main()
{
	int T;
	scanf("%d", &T);
	while (T--) {
		scanf("%d", &N);
		int sum = 0;
		for (int i = 0; i < N; i++) {
			scanf("%d", &s[i]);
			sum += s[i];
		}
		if (sum % 4 != 0) {
			puts("no");
			continue;
		}
		tem = sum / 4;

		sort(s, s + N);

		memset(vis, false, sizeof(vis));
		if (dfs(0, 0, 0)) {
			puts("yes");
		}
		else {
			puts("no");
		}
	}
	return 0;
}






ESD放电模式以及电源箝位 (power clamp )电路 由于ESD电压具有很快的上升速度(其ESD脉冲上升时间约在10ns左右),Vrc端的电压因为RC延迟效应无法跟得上VDD端的ESD电压上升速度,Vrc端的为低电位导致反相器工由于ESD电压具有很快的上升速度(其ESD脉冲上升时间约在10ns左右),Vrc端的电压因为RC延迟效应无法跟得上VDD端的ESD电压上升速度,Vrc端的为低电位导致反相器工作将输出端Vout电压上拉到高电位。从而Vg端的高电位触发导通了NMOS元件(Mesd)的晶体管,因而ESD电流便经由Mesd而泄放掉。由于晶体管Mesd的栅极导通 阅读详情

相关推荐

多尺度Transformer+特征融合新范式,算力减半精度猛增

在大模型时代,多尺度特征融合与Transformer架构的结合正成为研究热点。多尺度特征融合能够捕捉数据在不同尺度上的关键信息,而Transformer架构凭借其强大的并行处理能力和对长距离依赖的建模能力,为复杂数据处理提供了新的思路。这种结合在处理多模态数据时展现出巨大潜力。

Tulingxueshu的博客 1057

poj2362

Square 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

huanhuanxiaoxiao的博客 504

realsense D455深度相机+YOLO V5结合实现目标检测(一)

realsense D455深度相机+YOLO V5结合实现目标检测代码来源环境配置代码分析:1.如何用realsense在python下面调用的问题:2.对main_debug.py文件的分析:结束语 可以实现将D435,D455深度相机和yolo v5结合到一起,在识别物体的同时,还能测到物体相对与相机的距离。 说明一下为什么需要做这个事情?1.首先为什么需要用到realsense D455深度相机? 因为他是普通的相机还加了一个红外测距的东西,所以其他二维图像一样,能够得到三维世界在二维像素平面的投影

文一生 3万+

poj2362 - Square

想看更多的解题报告: http://blog.csdn.net/wangjian8006/article/details/7870410                                   转载请注明出处:http://blog.csdn.net/wangjian8006 题目大意:给出n条木棍的长度,将这些木棍头尾相接,问能不能组成一个正方形,如果可以,那么输出yes,否

贰圣 830

vue3接入大华摄像头

┃ ┃ ┣ 📜PlaybackModal.vue 回放列表模态框。┃ ┃ ┗ 📜VideoGrid.vue 视频播放区域。┃ ┃ ┣ 📜ControlPanel.vue 控制面板。┃ ┃ ┣ 📜DeviceList.vue 设备列表。┃ ┣ 📂module //大华摄像头文件。

💻 专注 Vue 前端与 Java 后端技术 🌱 目前正在深入 Spring Boot、微服务与性能优化 📝 定期分享实战踩坑经验与学习笔记 🤝 欢迎交流,共同进步 913

模型实战(16)之StrongSort (OSNET)配合YOLOv5、v7、v8 实现多目标跟踪详解

StrongSort (OSNET)配合YOLOv5、v7、v8 实现多目标跟踪详解

yohnyang的博客 1768

POJ 2362 Square(DFS回溯构造)

POJ2362 Square(DFS回溯构造) http://poj.org/problem?id=2362 题意:给你M根长度可能不同的棍子,问你用着M根棍子能否拼成一个正方形. 分析:首先将M根棍子的总长sum求出,sum%4必须==0且任意一个棍子的长度        用vis[i]数组表示当前第i根棍子是否被使用了.        然后用dfs来判断能否构成正方形的三边即可.其中

code 2514

线程池详解(通俗易懂超级好)

目标 【理解】线程池基本概念 【理解】线程池工作原理 【掌握】自定义线程池 【应用】java内置线程池 【应用】使用java内置线程池完成综合案例 线程池 线程池基础 线程池使用 线程池综合案例 4.学员练习 5.线程池总结 概念介绍 1:什么是线程池 2:为什么使用线程池 3:线程池有哪些优势 什么是池 什么是线程池 线程池其实就是一种多线程处理形式,处理过程中可以将任务添加到队列中,然后在创建线程后自动启动这些任务。这里的线程就是我们前面学过的线程,这里的任务就是我们前面学过的实现了Runna.

拉格朗日的学习笔记 12万+

POJ 2362 Square(DFS+剪枝)

POJ 2362 Square Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 27083 Accepted: 9158 Description Given a set of sticks of various lengths, is it possible to join them end-to-end...

ZQYnn's blog 396

Android 10.0 任务栏音乐播放器后台播放杀进程功能实现

在10.0的系统rom定制化开发过程中,在某些情况下在安装第三方播放器以后,播放音乐的时候,在最近任务栏recents列表中,点击全部清除,发现音乐播放器还在播放音乐,导致出现bug,完整的 解决方法,肯定是需要点击全部清除以后,音乐播放器也被杀掉进程,接下来看下这个问题怎么解决

安卓兼职framework和app工程师的博客 650

NXP S32k3 MCAL EMIOS PWM配置

NXP s32k 配置 EMIOS PWM

Leon_0125的博客 2693

【DFS + 剪枝】POJ 2362 Square

这段时间要沉迷刷题一段时间了,就让优快云陪我一起吧! 一、题目大意 这个题目的大致意思就是给定多个长度为M的数组,每个数组代表一系列的木棍,每个数组元素代表木棍长度,求问每个数组是否能够首尾相接,连接成一个正方形。如果可以的话输出yes,否则输出no 二、题目思路以及AC代码 一开始我以为这题就是简单的dfs,dfs的思路也很简单,就是首先根据输入数组求解出如果能合成正方形的边长,然后分4次...

Johnson的博客 238

C#与天文观测:Celestia模拟星空的奇幻之旅

Celestia就像一艘穿梭在星海中的小飞船,带领我们遨游宇宙。C#则是这艘飞船的智能导航系统,用代码指挥它飞向任何我们向往的星球或星系。首先,下载并安装Celestia,熟悉其基本操作和功能。创建一个星空目标列表,包括不同的恒星、行星和星系。// 示例:定义观察目标列表new SpaceObject("太阳"),new SpaceObject("月球"),new SpaceObject("火星")

java专栏 1455

POJ 2362 HDOJ 1518 Square DFS剪枝

Square Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 18949   Accepted: 6567 Description Given a set of sticks of various lengths, is it possible to join th

kdwycz的刷题空间 861

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Square poj2362深度优先搜索+剪枝

1.题目原文 Square Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 24028   Accepted: 8300 Description Given a set of sticks of various lengths, is it possibl

相思作坊半世离殇的博客 426

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

poj 2362 || zoj 1909 Square (DFS+剪枝)

题目链接:http://poj.org/problem?id=2362 题目大意:给出M条筷子,问是否能够拼凑成正方形,是则打印yes,否则no. 解题思路:范围4                   剪枝:1.总数不能被4整除,直接打印 no;                              2.最长的那个筷子大于平均数,直接打印 no;

ンZee的解题报告 1198

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

POJ 2362 Square (DFS +剪枝)

Square

Tc的专栏 1172

POJ 2362 Square-(DFS+ 剪枝)

题目链接 题目大意:     给定一组木棍长度的数据,求是否能拼成一个正方形. 解题思路:     简单的DFS遍历就好了,但是本题要考虑剪枝     1)当所有木棍长度和sum, 需要满足sum%4 = 0,否则拼不成正方形。     2)最长的木棍要满足小于边长side = sum / 4。     在1)2)条件下进行DFS遍历,可以减小时间复杂度。

小梁的编程学习之旅 331

poj 2362 Square (dfs+剪枝)

2362 -- Square   跟1011的Sticks差不多,不过这里是问给出的长度能否拼成一个正方形。这题数据比较小,不过对剪枝的要求还是差不多的。 主要的剪枝是: 1.由大到小排序后,在拼当前边的第一条棍子的时候必须选用当前没有用过的棍子中最长那条 2.在搞同一条边的时候,下一条棍子不会比之前选了的大 3.同一长度的棍子只搜一次 然后就是代码: 1 #include...

weixin_30790841的博客 102

POJ-2362 - Square (DFS + 剪枝)

Square 题目链接:A - Square POJ - 2362 题意 给你n个小木棍,要求全部用上,能否组成一个正方形。 思路 我原先的方法,非常非常暴力,就开个dfs,来记录每个状态的值,反正每个木棍都是要组成一个边的,于是我就枚举它放边的过程,复杂度为4^20次方吧,果然会炸。 有些基本的优化就不谈了,比如最长的边大于平均边,边总和不是4的倍数。。。 现在考虑枚举...

帅帅的博客 295

poj 2362 Square(dfs, 剪枝)

Square Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 23828   Accepted: 8253 Description Given a set of sticks of various lengths, is it possible to join th

CillyB的博客 448

ZOJ1909 POJ2362 HDU1518 Square,很经典的DFS+剪枝!

这题很经典的DFS+剪枝!我做了很久,DFS的回溯一直很混乱后来参考了这篇解题报告后顿时茅塞顿开!解题报告请猛击我!我的报告里面有对应的剪枝解释 /******************************************************************************* # Author : Neo Fung # Email : neosfun

Neo Fung的专栏 1634

DFS POJ 2362 Square

题目传送门 1 /* 2 DFS:问能否用小棍子组成一个正方形 3 剪枝有3:长的不灵活,先考虑;若根本构不成正方形,直接no;若第一根比边长长,no 4 这题是POJ_1011的精简版:) 5 */ 6 #include <cstdio> 7 #include <iostream> 8 #incl...

weixin_30363509的博客 76

hdu1518 Square | ZOJ1909 | POJ2362 (dfs + 剪枝)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1518 题意:给你n根木棒,问用光所有的木棒能否拼成正方形。 dfs 剪枝:        1、当搜到三条边的时候,第四条边也就确定了。这时就找到解了,可以停止搜索了。        2、由于每一根木棒都要使用,所以在搜第一条边的时候可以直接拿第一根木棒作为这条边的头一根木

天亮说晚安 1924
上一篇: hdu5636 BestCoder Round #74 (div.2) 1002 Shortest Path
下一篇: poj1011-Sticks dfs各种剪枝
Daemoonn
博客等级 码龄11年 42粉丝 198原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值