#include <iostream>
#include <cmath>
#define EPS 1e-6
using namespace std;
double arr[5];
bool isZero(double n){
if(fabs(n-0)<EPS)
return true;
return false;
}
//參數(shù)的意思是輸入的數(shù)字和數(shù)字的個(gè)數(shù)
bool canfind(double a[],int n){
if(n==1){
if(isZero(a[0]-24)){
return true;
}
else
return false;
}
double b[5];
//通過(guò)兩重循環(huán)來(lái)遍歷所有的取兩個(gè)數(shù)字的情況
for(int i=0;i<n;++i){
for(int j=i+1;j<n;++j){
int m=0;
//先給n-2的數(shù)字賦上值
for(int k=0;k<n;++k){
if(k!=j&&k!=i){
b[m++]=a[k];
}
}
//開(kāi)始枚舉這兩個(gè)數(shù)字的運(yùn)算方式忘瓦,如果
b[m]=a[i]+a[j];
if(canfind(b,n-1)){
return true;
}
b[m]=a[i]-a[j];
if(canfind(b,n-1)){
return true;
}
b[m]=a[j]-a[i];
if(canfind(b,n-1))
return true;
b[m]=a[i]*a[j];
if(canfind(b,n-1))
return true;
if(!isZero(a[i])){
b[m]=a[j]/a[i];
if(canfind(b,n-1))
return true;
}
if(!isZero(a[j])){
b[m]=a[i]/a[j];
if(canfind(b,n-1))
return true;
}
}
}
return false;
}
int main()
{
while(true){
for(int i=0;i<4;++i){
cin>>arr[i];
}
if(isZero(arr[0]))
break;
if(canfind(arr,4))
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}
這道題相對(duì)復(fù)雜,是屬于可以先走一步不斷遞歸降低問(wèn)題規(guī)模的類(lèi)型叠骑,總體思想是不斷地將兩個(gè)數(shù)字通過(guò)枚舉所有的四種運(yùn)算方法變成一個(gè)數(shù)字火本,這樣n個(gè)數(shù)的問(wèn)題就轉(zhuǎn)化為了n-1個(gè),直到問(wèn)題簡(jiǎn)化偽為1個(gè)數(shù)字是否為24温学。同時(shí)注意代碼實(shí)現(xiàn)時(shí)不要將double=0略贮,注意細(xì)節(jié)比如除數(shù)不能等于0。先行寫(xiě)出邊界條件仗岖。