题目大意:五个数字三种符号(+,-,×)任意组合是否能够得到 23。
解题思路:就是各种暴力枚举…
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int num[5];
int vis[5];
int tag;
void dfs(int cnt, int sum) {
if (cnt == 5) {
if (sum == 23) tag = 1;
return;
}
for (int i = 0; i < 5; i++)
if (!vis[i]) {
vis[i] = 1;
for (int j = 0; j < 3; j++)
if (j == 0) dfs(cnt+1, sum + num[i]);
else if (j == 1) dfs(cnt+1, sum - num[i]);
else if (j == 2) dfs(cnt+1, sum * num[i]);
vis[i] = 0;
}
}
int main() {
while (1) {
int sum = 0;
for (int i = 0; i < 5; i++) {
scanf("%d", &num[i]);
sum += num[i];
}
if (!sum) break;
tag = 0;
for (int i = 0; i < 5; i++) {
vis[i] = 1;
dfs(1, num[i]);
vis[i] = 0;
}
if (tag) printf("Possible\n");
else printf("Impossible\n");
}
return 0;
}