http://vjudge.net/vjudge/problem/viewProblem.action?id=19643
Time Limit: 3000MS | Memory Limit: Unknown | 64bit IO Format: %lld & %llu |
Description
![Download as PDF Download as PDF](https://i-blog.csdnimg.cn/blog_migrate/2ea975a8d421ce3226c46b0946fd5932.png)
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
的二个每次利用前一次的结果.
暴力也要讲方法.
#include <iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int a[6],A[6],flag,vis[6],v[6];
char b[]= {"*-+"},B[6];
void dfs1(int cur)
{
int t;
if(flag) return ;
else if(cur==5)
{
t=A[0];
for(int i=0; i<4; i++)
{
switch (B[i])
{
case '+':t=t+A[i+1];break;
case '-':t=t-A[i+1];break;
case '*':t=t*A[i+1];break;
default:break;
}
if(t>154) break;
}
if(t==23) flag=1;
}
else for(int i=0; i<3; i++)
{
B[cur]=b[i];
dfs1(cur+1);
}
}
void solve(int cur, int sum)
{
if(cur == 5)
{
if(sum == 23)
flag = 1;
return ;
}
solve(cur + 1, sum + A[cur]);
if(flag)
return;
solve(cur + 1, sum - A[cur]);
if(flag)
return;
solve(cur + 1, sum * A[cur]);
if(flag)
return;
}
void dfs(int cur)
{
if(flag)
return ;
else if(cur==5)
{
dfs1(0);
// solve(1,A[0]);
}
else for(int i=0; i<5; i++)
{
if(!v[i])
{
v[i]=1;
A[cur]=a[i];
dfs(cur+1);
v[i]=0;
}
}
}
int main()
{
freopen("in.txt","r",stdin);
while(scanf("%d%d%d%d%d",&a[0],&a[1],&a[2],&a[3],&a[4]))
{
if(a[0]==0) break;
dfs(0);
if(flag) cout<<"Possible"<<endl;
else cout<<"Impossible"<<endl;
memset(A,0,sizeof(A));
memset(B,0,sizeof(B));
memset(v,0,sizeof(v));
memset(vis,0,sizeof(vis));
flag=0;
}
return 0;
}