給定 4 個整數(1~13),判斷能否通過加減乘除運算(每個數恰好用一次)得到 24。多組測試用例,輸出 "Yes" 或 "No"。
數字只有 4 個,搜索空間極小,直接暴力 DFS 即可:
1e-8)。遞歸函數 dfs(double* a, int n):
n == 1,檢查 |a[0] - 24| < eps。n 個數中任選兩個 a[i], a[j],應用 4 種運算(注意除零),生成新數組遞歸,回溯恢復。#include <iostream>
#include <cmath>
using namespace std;
const double EPS = 1e-8;
double a[5];
bool dfs(double* a, int n) {
if (n == 1) return fabs(a[0] - 24) < EPS;
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
double x = a[i], y = a[j];
double b[5];
int m = 0;
for (int k = 0; k < n; ++k) if (k != i && k != j) b[m++] = a[k];
// 嘗試 6 種運算結果(交換律下減法除法有序)
double results[6] = {x + y, x - y, y - x, x * y};
if (fabs(y) > EPS) results[m++] = x / y;
if (fabs(x) > EPS) results[m++] = y / x;
for (int k = 0; k < m; ++k) {
b[m-1] = results[k];
if (dfs(b, m)) return true;
}
}
}
return false;
}
int main() {
while (cin >> a[0] >> a[1] >> a[2] >> a[3]) {
cout << (dfs(a, 4) ? "Yes" : "No") << endl;
}
return 0;
}
EPS。