//DFS+回溯算法,每次只能直接处理2个数,因此先将4个数变为3个数,再将三个数变为两个数就可以处理了
#include<iostream>
using namespace std;
#include<vector>
#include<cmath>
//使用double和除法运算时可能会损失精度,定义一个极小值来避免误差
const double epsilon = 1e-6;
bool dfs(vector<double>nums)
{
int size=nums.size();
//先写递归出口,nums数组每次处理两个数后size-1,当只剩最后一个数时即可判断
if(size==1)
{
return fabs(nums[0]-24) < epsilon;
}
//每次选择两个数进行运算处理,将结果放回原容器后进行下一步处理
for(int i=0; i< size; i++)
{
for(int j=i+1; j<size; j++)
//当size为4时,共有取第1 2,1 3,1 4,2 3,2 4,3 4个数 共六种情况
{
//将不参与运算的剩余数字存放next容器中用于下一步的递归
vector<double> next;
for(int k=0; k<size ;k++)
{
if(k!=i && k!=j)
next.push_back(nums[k]);
}
//用一个容器存放两个数的运算结果
double a= nums[i],b=nums[j];
vector<double>res={ a+b, a-b, b-a, a*b };
//计算除法时需要注意除数不能为0
if(a!=0)
res.push_back(b/a);
if(b!=0)
res.push_back(a/b);
//依次处理nums[i]和nums[j]的所有运算结果
for(auto it : res)
{
//把得到的结果放回next容器,这样数字数量就-1,然后进行下一次递归
next.push_back(it);
if(dfs(next))
return true;
//如果没有return true说明这个next数组不能满足要求,要尝试下一个next
next.pop_back();
}
}
}
//尝试完了所有组合都没有成功
return false;
}
int main()
{
vector<double> nums;//除法可能出现小数
int num;
while(cin>>num)
{
nums.push_back(num);
}
if(dfs(nums))
{
cout<<"true";
}
else
{
cout<<"false";
}
return 0;
}