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)
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.
For each 5-Tupel print "Possible" (without quotes) if their exists an arithmetic expression (as described above) that yields 23. Otherwise print "Impossible".
1 1 1 1 1
1 2 3 4 5
2 3 5 7 11
0 0 0 0 0
Impossible
Possible
Possible
题意:
给出的数字,利用加减乘的规则看能不能变成23;
同样的利用回溯来做;
#include
#include
int a[10],vis[10];
int dfs(int cur,int tot)
{
int i,j,t;
if(cur==5)
{
if(tot==23)
return 1;
else
return 0;
}
for(i=0;i<3;i++)
for(j=0;j<5;j++)
if(!vis[j])
{
vis[j]=1;
if(i==0)
t=tot+a[j];
else if(i==1)
t=tot-a[j];
else
t=tot*a[j];
if(dfs(cur+1,t))
return 1;
vis[j]=0;
}
return 0;
}
int main()
{
int i,j,k,ok;
while(1)
{
for(i=0;i<5;i++)
scanf("%d",&a[i]);
if(a[0]==0)
break;
memset(vis,0,sizeof(vis));
ok=0;
for(i=0;i<5;i++)
{
vis[i]=1;
if(dfs(1,a[i]))
{
ok=1;
break;
}
vis[i]=0;
}
if(ok)
printf("Possible\n");
else
printf("Impossible\n");
}
return 0;
}
#include
#include
#include
#define N 5
using namespace std;
int a[N];
int vis[N];
int flag;
void dfs(int n,int sum) {
if (n == 5 && sum == 23) {
flag = 1;
return ;
}
if (flag) return ; // 没有这一步会超时
else {
for (int j = 0; j < N; j++) {
if (!vis[j]) {
vis[j] = 1;
if (n == 0) dfs(n+1,a[j]);
else {
dfs(n+1,sum + a[j]);
dfs(n+1,sum - a[j]);
dfs(n+1,sum * a[j]);
}
vis[j] = 0;
}
}
}
}
int main() {
while (1){
for (int i = 0; i < N; i++)
scanf("%d",&a[i]);
if (a[0] == 0 && a[1] == 0 && a[2] == 0 && a[3] == 0 && a[4] == 0)
break;
memset(vis,0,sizeof(vis));
flag = 0;
dfs(0,0);
if (flag) printf("Possible\n");
else printf("Impossible\n");
}
}