5 5 5 1 1 1 4 2 0 0 0 0
YES NO
/* http://bailian.openjudge.cn/practice/2787/ 2787:算24 */ #include<iostream> #include<cmath> using namespace std; #define EPS 1e-6 double a[5]; bool IsZero(double x) { //if (fabs(x) < EPS) // return true; //else // return false; return fabs(x) <= EPS; } bool count24(double a[],int n ) {//用数组 a 里的 n 个数,计算 24 if (1 == n) { if (IsZero(a[0] - 24)) return true; else return false; } double b[5]; for (int i = 0; i < n - 1; i++) { for (int j = i + 1; j < n; j++) { // 枚举两个数的组合 int m = 0; for (int k = 0; k < n; k++) // 还剩下 m 个数 , m = n 2 { if (k != i && k != j) b[m++] = a[k]; // 把其余数放入 b } b[m] = a[i] + a[j]; /* pay attention at here */ if (count24(b, m + 1)) return true; b[m] = a[i] - a[j]; if (count24(b, m + 1)) return true; b[m] = a[j] - a[i]; if (count24(b, m + 1)) return true; b[m] = a[i] * a[j]; if (count24(b, m + 1)) return true; // a[i] != 0 can divide if (!IsZero(a[i])) b[m] = a[j] / a[i]; if (count24(b, m + 1)) return true; if (!IsZero(a[j])) b[m] = a[i] / a[j]; if (count24(b, m + 1)) return true; } } // can not omit // !!! pay attention // 如果枚举了数组a[]中的所有可能,都算不出24,不能return true, // 说明 当前这一组数,是算不出24的,return false,尝试其他的可能组合 return false; } int main() { //如何不停的读入输入的4个数 int i = 0; while (true) { double sum = 0; for (i = 0; i < 4; i++) { cin >> a[i]; sum += a[i]; // 0 0 0 0 终止,输入都是正整数 } if (IsZero(sum)) break; bool result = count24(a, 4); if (result) cout << "YES" << endl; else cout << "NO" << endl; } return 0; }
《程序设计与算法(二)算法基础》《第二周 递归》算24 2787
原文:https://www.cnblogs.com/focus-z/p/11480396.html