HDU1518——Square(正方形问题)
2016-12-26 10:48
483 查看
Square
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 13808 Accepted Submission(s): 4376
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
解:
正方形问题:
要求给定的所有木棍能否组成一个正方形
那么正方形的变长应该是所有木棍长度之和的四分之一 eage,如果不能整除一定不能构成正方形,
而且当给定的数组中最大值大于eage的时候也不能组成正方形
定义sum[4]数组,用来分别存放每条边的长度,
每条边都有 n 种木棍可以选择,而且一条边可以有多个木棍,
所以回溯过程中,将每一条木棍加入每个边
如果,t==n 到达解空间,此时如果 sum[4] 中的每一个都等于开始算出的边长eage则可组成正方形,反之不可以
剪枝不够提交超时(上课代码):
#include <stdio.h> #include <string.h> int a[100]; int n; int sum[5]={0}; int eage; int flag=0; void dfs(int t) { if(flag==1) return; if(t==n) { if(sum[1]==eage && sum[2]==eage && sum[3]==eage && sum[4]==eage) flag=1; return; } for(int i=1;i<5;i++) { sum[i]+=a[t]; if(sum[1]<=eage && sum[2]<=eage && sum[3]<=eage && sum[4]<=eage){ dfs(t+1); } sum[i]-=a[t]; } } int main() { int t; scanf("%d",&t); while(t--){ int max=0; scanf("%d",&n); memset(a,0,sizeof(a)); memset(sum,0,sizeof(sum)); eage=0; for(int i=0;i<n;i++) { scanf("%d",&a[i]); if(a[i]>max) { max=a[i]; } eage+=a[i]; } if(eage%4!=0 || max>(eage/4)) printf("no\n"); else{ eage/=4; dfs(0); if(flag==1) { printf("yes\n"); }else printf("no\n"); } } return 0; }
修改之后加强剪枝:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int tt,num[25],flag[25],aver,f; void dfs(int length,int count,int k) { if(f) { return ; } if(length==aver) { count++; if(count==4) { f=1; return ; } k=0; length=0; } for(int i=k;i<tt;i++) { if(!flag[i] && length+num[i]<=aver) { flag[i]=1; dfs(length+num[i],count,i); flag[i]=0; } } } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d",&tt); int sum=0,max=0; for(int i=0;i<tt;i++) { scanf("%d",&num[i]); sum+=num[i]; if(num[i]>max) { max=num[i]; } } if(sum%4!=0||max>(sum/4)) { printf("no\n"); continue; } aver=sum/4; memset(flag,0,sizeof(flag)); f=0; dfs(0,0,0); if(f==1) { printf("yes\n"); }else{ printf("no\n"); } } return 0; }
相关文章推荐
- HDU - 1518 Square (能否组成正方形)
- hdu 1518 Square
- HDU ACM 1518 Square (DFS)
- Square hdu 1518
- HDU--杭电--1518--Square--深搜--要剪枝
- 【DFS】hdu 1518 Square
- HDU 1518 Square
- hdu-1518-Square
- hdu 1518——Square
- hdu 1518 Square(dfs)
- HDU--1518 -- Square [DFS深搜]
- HDU 1518 Square 深搜
- hdu 1518 Square(dfs)
- HDU 1518 Square
- HDU 1518 Square
- HDU 1518 Square(Dfs)
- HDU 1518 - Square
- DFS HDU 1518 Square
- hdu 1518 Square(DFS)
- hdu 题目1518 Square (DFS)