7-95 拔河比赛 (100分)

拔河比赛

【问题描述】 熊出没之探险日记,讲述了夏季休林季,光头强变身成为一名导游,并与熊大熊二一起, 帮助小女孩赵琳去往森林深处找寻儿时玩伴东北虎的故事。 某一天,他们准备进行拔河比赛,森林里很多动物都想来报名参加。经过投票,他们最 终选出了光头强,赵琳,熊大,熊二,吉吉,毛毛。由于不同动物和人的力量明显是不一样 的,所以这个拔河比赛可能会很不公平。于是他们想每 3 个分成一组,并对每位选手的力量 值做一个适当的估计,力量估计值都是一个正整数。 拔河比赛马上就要开始了,请你根据给出的力量值来判断是否可以分成两组,每组 3 位选手,同时要求每组的力量值总和相等。

输入格式:
第一行是一个正整数 T,表示共计有 T 组数据需要判定。接下对于每组数据, 都是 6 个正整数,表示每位选手的实力,每组数据占一行。

输出格式:
对于每组数据,如果可以分成实力相同的两个队伍,就输出 yes,否则就输出 no,每个 输出占一行。

输入样例1:
1
1 3 2 1 2 1

输出样例1:
yes

输入样例2
2
1 1 1 1 1 99
1 1 1 1 1 1

输出样例2:
no
yes
(性质是排列组合)
思路:找出所有三个数的组合,看是否和剩余三个数的和相同。用dfs实现。

#include <bits/stdc++.h>
#define mm(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
int a[10],vis[10],t,temp=0,flag=0;
void dfs(int k,int sum,int temp){
	if(k>3){
		if(sum==temp) flag=1;
		return;
	}
	else for(int i=k;i<=6;i++){
		if(!vis[i]){
			vis[i]=1;
			dfs(k+1,sum+a[i],temp-a[i]);
			vis[i]=0;
		}
	}
}
int main(){
	scanf("%d",&t);
	while(t--){
		mm(vis,0);
		mm(a,0);
		temp=0;
		flag=0;
		for(int i=1;i<=6;i++){
			scanf("%d",&a[i]);
			temp+=a[i];
		}
		dfs(1,0,temp);
		if(flag) cout << "yes" << endl;
		else cout << "no" << endl;
	}
	return 0;
	
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值