题目链接
动手之前要想好解空间树,解空间树是决定复杂度的关键,极端情况的微弱剪枝效果往往不佳。
一开始的想法(相对麻烦,可以直接跳过)
三条边的长度已知(sum),按照边的长度作为dfs的参数a
- 遍历每条边,未被使用过且sum - a大于当前边,则将该木棍纳入该边
- 当边长符合题目要求时,判断此时是第几条满足要求的边
- 如果是第三条,则判断是否全部边都被使用,不是则判断为不可能,是则输出yes,结束
- 如果不是第三条满足要求边,则将当前边长归零,重复1-3过程
仅通过了8组测试样例
#include<bits/stdc++.h>
using namespace std;
int cnt[25], n, sum, res, num;
bool vis[25];
void dfs(int a){
if(a == sum){
a = 0;
res++;
if(res == 3)
{
if(num == n)
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
exit(0);
}
else
{
dfs(a);
res--