有关于算24的问题
通过递归来实现
递归的思考步骤
第一步:分解成小规模的问题
第二步:找出边界的条件
#include<bits/stdc++.h>
using namespace std;
double a[5];
#define eps 1e-6
const int num=10;
bool IsZero(double x) { //double浮点数除法要用精度判断
if(abs(x<=eps)) return true;
else return false;
}
bool Count(double a[],int n) {
if(n==1) {//只有一个数的情况
if(IsZero(a[0])) {
return true;
}
return false;
}
double b[5];
for(int i=0; i<n; i++) { //分解成子问题两两相加缩小一个规模
for(int j=i+1; j<n; j++) { //枚举两个数的组合
int m=0;//剩下的数字
for(int k=0; k<n; k++) {
if(k!=i&&k!=j)//选出的数为ij
b[m++]=a[k];
}
//枚举两数所有情况
b[m]=a[i]+a[j];//将第一对情况加入b中
if(Count(b,m+1))//m本身为n-2个数字,现在数组中应该剩下n-1,也即规模减小1
return true;
b[m]=a[i]-a[j];
if(Count(b,m+1))
return true;
b[m]=a[j]-a[i];
if(Count(b,m+1))
return true;
b[m]=a[i]*a[j];
if(Count(b,m+1))
return true;
if(Count(b,m+1))
return true;
if(!IsZero(a[j])) { //除数不为0
b[m]=a[i]/a[j];
if(Count(b,m+1))
return true;
}
if(!IsZero(a[i])) { //除数不为0
b[m]=a[j]/a[i];
if(Count(b,m+1))
return true;
}
}
return false;
}
}
int main() {
for(int i=0; i<4; i++)
cin>>a[i];
int x;
for(x=0; x<4; x++) {
if(a[x]==0)
continue;
else break;
}
if(x==4) return 0;
if(Count(a,4))
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
return 0;
}