Problem I
23 Out of 5
Input: standard input
Output: standard output
Time Limit: 1 second
Memory Limit: 32 MB
Your 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".
Sample Input
1 1 1 1 1
1 2 3 4 5
2 3 5 7 11
0 0 0 0 0
Sample Output
Impossible
Possible
Possible
Thomas Strohmann
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
using namespace std;
int a[10];
int flag;
void DFS(int sum,int p)
{
if(p == 5)
{
if(sum == 23)
{
flag = 1;
}
return ;
}
for(int i=0; i<3; i++)
{
if(i == 0)
{
DFS(sum + a[p],p+1);
}
else if(i == 1)
{
DFS(sum - a[p],p+1);
}
else if(i == 2)
{
DFS(sum * a[p],p+1);
}
}
}
int main()
{
while(scanf("%d",&a[0])!=EOF)
{
for(int i=1; i<5; i++)
{
scanf("%d",&a[i]);
}
int t = 0;
for(int i=0;i<5;i++)
{
if(a[i] == 0)
{
t++;
}
}
if(t == 5)
{
break;
}
flag = 0;
sort(a,a+5);
do
{
DFS(a[0],1);
}
while (next_permutation(a,a+5)&&!flag);
if(flag == 1)
{
printf("Possible\n");
}
else
{
printf("Impossible\n");
}
}
return 0;
}