10344 - 23 out of 5
Time limit: 3.000 secondsYour task is to write a program that can decide whether you can find an arithmetic expression consisting of five given numbers (1<=i<=5)
that will yield the value 23.
For this problem we will only consider arithmetic expressions of the following from:
where: {1,2,3,4,5} -> {1,2,3,4,5} is a bijective function
and{+,-,*} (1<=i<=4)
Input
The Input consists of 5-Tupels of positive Integers, each between 1 and 50.
Input is terminated by a line containing five zero's. This line should not be processed.
Output
For each 5-Tupel print "Possible" (without quotes) if their exists an arithmetic expression (as described above) that yields 23. Otherwise print "Impossible".
Simple Input
1 1 1 1 1
1 2 3 4 5
2 3 5 7 11
0 0 0 0 0
Simple Output
Impossible
Possible
Possible
Thomas Strohmann
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
long a[6], t[6];
bool vis[6], can;
void dfs2(int depth, long nowsum) {
if (can) return;
if (depth > 5) {
if (nowsum == 23) {
can = true;
}
return;
}
dfs2(depth + 1, nowsum + t[depth]);
dfs2(depth + 1, nowsum - t[depth]);
dfs2(depth + 1, nowsum * t[depth]);
}
void dfs1(int depth) {
if (can) return;
if (depth > 5) {
dfs2(2, t[1]);
return;
}
for (int i = 1; i <= 5; i ++) {
if (!vis[i]) {
vis[i] = true;
t[depth] = a[i];
dfs1(depth + 1);
vis[i] = false;
}
}
}
int main() {
while (scanf("%ld%ld%ld%ld%ld", &a[1], &a[2], &a[3], &a[4], &a[5]) == 5) {
long sum = 0;
for (int i = 1; i <= 5; i ++) {
sum += a[i];
}
if (sum == 0) {
break;
}
memset(t, 0, sizeof(t));
memset(vis, false, sizeof(vis));
can = false;
dfs1(1);
if (can) {
printf("Possible\n");
} else {
printf("Impossible\n");
}
}
return 0;
}