//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; }