1. 程式人生 > >洛谷 P2383 狗哥玩木棒

洛谷 P2383 狗哥玩木棒

抓狂 文件中 測試 read turn bsp 如果 names cnblogs

題目背景

狗哥又趁著語文課幹些無聊的事了...

題目描述

現給出一些木棒長度,那麽狗哥能否用給出的木棒(木棒全用完)組成一個正方形呢?

輸入輸出格式

輸入格式:

輸入文件中的第一行是一個整數n表示測試的組數,接下來n行表示每組的測試數據。 每行的第一個數為m(4<=m<=20),接下來m個數ai(1<=ai<=1000)表示木棒的長度。

輸出格式:

對於每組測試數據,如果可以組成正方形輸出“yes”,否則輸出“no”。

輸入輸出樣例

輸入樣例#1:
3
4 1 1 1 1 
5 10 20 30 40 50 
8 1 7 2 6 4 4 3 5
輸出樣例#1:
yes
no
yes

說明

狗哥快抓狂了

dfs

屠龍寶刀點擊就送

#include <algorithm>
#include <cstring>
#include <cctype>
#include <cstdio>
using namespace std;
inline void Read(int &x)
{
    register char ch=getchar();
    for(x=0;!isdigit(ch);ch=getchar());
    for
(;isdigit(ch);x=x*10+ch-0,ch=getchar()); } bool flag,use[21]; int n,m,a[21],sum; void dfs(int now,int num,int z) { if(flag) return; if(num==4&&z==m) {flag=1;return;} for(int i=1;i<=m;++i) { if(!use[i]&&now+a[i]<=sum) { use[i]
=1; (now+a[i])%sum==0?dfs((now+a[i])%sum,num+1,z+1):dfs((now+a[i])%sum,num,z+1); use[i]=0; } } } int main() { Read(n); for(;n--;) { sum=0; flag=0; Read(m); for(int i=1;i<=m;++i) Read(a[i]),sum+=a[i]; if(sum%4) {printf("no\n");continue;} sort(a+1,a+1+m); sum/=4; dfs(0,1,1); if(flag) printf("yes\n"); else printf("no\n"); } return 0; }

洛谷 P2383 狗哥玩木棒