等边三角形

探讨使用不同长度的小木棍拼接成等边三角形的算法,通过递归深度优先搜索策略,验证是否所有木棍都能用于形成一个等边三角形。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

 

小白手上有一些小木棍,它们长短不一,小白想用这些木棍拼出一个等边三角形,并且每根木棍都要用到。 例如,小白手上有长度为 1,2,3,3 的4根木棍,他可以让长度为1,2 的木棍组成一条边,另外 2 跟分别组成 2 条边,拼成一个边长为 3 的等边三角形。小白希望你提前告诉他能不能拼出来,免得白费功夫。

Input

 

首先输入一个整数 n(3 ≤ n ≤ 200),表示木棍数量,接下来输入 n 根木棍的长度 p_i(1 ≤ p_i ≤ 10000)。

Output

 

如果小白能拼出等边三角形,输出"yes",否则输出"no"。

 Sample Input 1 

5
1 2 3 4 5

Sample Output 1

   yes

Sample Input 2 

4
1 1 1 1

Sample Output 2

   no

  直接“神”搜:

#include <bits/stdc++.h>
#define _MAX 100001
using namespace std;
typedef long long ll;
ll n;
ll sum;
ll mid;
ll l[_MAX];
bool  flag;
void dfs(int i, int a, int b, int c) {//a,b,c表示三边长度,i表示添加的长度的下标
	if(a > mid || b > mid || c > mid) {//任意长度不可能大于边长;
		return ;
	}
	if(a == mid && b == mid && c == mid) {//满足
		cout << "yes" << endl;//输出
		flag = 1;
		return ;
	}
	if(i > n || flag == 1)
		return ;
	dfs(i + 1, a + l[i], b, c);
	dfs(i + 1, a, b + l[i], c);
	dfs(i + 1, a, b, c + l[i]);
	//搜索
}
int main() {
	cin >> n;//输入
	for(int i = 1; i <= n; i++) {
		cin >> l[i];//输入
		sum += l[i];//计算总和
	}
	if(sum % 3 != 0) {
		cout << "no" << endl;//排除除不尽的情况
		return 0;
	}
	mid = sum / 3;//计算边长
	for(int i = 1; i <= n; i++) {
		if(l[i] > mid) {
			cout << "no" << endl;//任意长度不可能大于边长;
			return 0;
		}
	}
	sort(l + 1, l + n + 1);//排序
	dfs(1, 0, 0, 0);//搜索
	if(!flag)
		cout << "no" << endl;//输出
	return 0;
}

好了,

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值