23 out of 5
题目传送:23 out of 5
解法:直接暴力,记得每次dfs调用都要回溯
AC代码:
#include <map>
#include <set>
#include <cmath>
#include <deque>
#include <queue>
#include <stack>
#include <cstdio>
#include <cctype>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
#define INF 0x7fffffff
using namespace std;
int a[5];
int vis[5];
bool dfs(int n, int ans) {
if(n >= 5) {
if(ans == 23) return true;
return false;
}
for(int i = 0; i < 5; i ++) {
if(!vis[i]) {
ans += a[i];
vis[i] = 1;
if(dfs(n + 1, ans)) return true;
vis[i] = 0;
ans -= a[i];
ans -= a[i];
vis[i] = 1;
if(dfs(n + 1, ans)) return true;
vis[i] = 0;
ans += a[i];
ans *= a[i];
vis[i] = 1;
if(dfs(n + 1, ans)) return true;
vis[i] = 0;
ans /= a[i];
}
}
return false;
}
int main() {
while(scanf("%d %d %d %d %d", &a[0], &a[1], &a[2], &a[3], &a[4]) != EOF) {
if(a[0] == 0 && a[1] == 0 && a[2] == 0 && a[3] == 0 && a[4] == 0) break;
memset(vis, 0, sizeof(vis));
int flag = 0;
for(int i = 0; i < 5; i ++) {
vis[i] = 1;
if(dfs(1, a[i])) {
flag = 1;
break;
}
vis[i] = 0;
}
if(flag == 1) {
printf("Possible\n");
}
else printf("Impossible\n");
}
return 0;
}