题目描述
题意很简单,给出5个数字,你可以使用 ‘ + ’ , ‘ - ’ , ‘ * ’运算符(运算符没有优先级关系),使得最后计算的结果等于
23,其中给出的5个数字可以任意改变顺序。
输入
输入5个数字,每个数字的大小范围为[1,50]。
输出
如果最后的运算结果可以等于23,输出Yes,不能的话输出No。
思路:用深搜对这五个数进行三种运算。
示例输入
1 1 1 1 1
1 2 3 4 5
2 3 5 7 11
示例输出
No
Yes
Yes
<span style="font-weight: normal;"><span style="font-size:18px;">#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
#define esp 1e-12
using namespace std;
int s[10];
bool vis[10],flag;
int ans;
int cal(int a,int b,int j) //分别进行三种运算
{
if(j==0)
return a+b;
else if(j==1)
return a-b;
else
return a*b;
}
bool dfs(int cnt) //形参是指进行完运算后的结果
{
ans=0;
for(int i=0; i<5; i++)
if(vis[i])
ans++;
if(cnt==23&&ans==5) //如果结果是23且进行运算的数是5个则返回真
{
flag=true;
return 1;
}
for(int i=0; i<5; i++) //开始枚举下一个数
{
if(!vis[i])
{
vis[i]=true; //进行标记
for(int j=0; j<3; j++) //枚举三种运算
{
if(dfs(cal(cnt,s[i],j)))
return 1;
}
vis[i]=false; //取消标记,对于dfs来说,dfs前进行标记,dfs后取消标记
}
}
return 0;
}
int main()
{
//freopen("lalala.text","r",stdin);
while(~scanf("%d %d %d %d %d",&s[0],&s[1],&s[2],&s[3],&s[4]))
{
flag=false;
for(int i=0; i<5; i++) //枚举每个数当起点
{
memset(vis,0,sizeof(vis)); //清空标记数组
vis[i]=true; //把本身标记上
if(dfs(s[i])) //从本身开始搜
break;
}
if(flag)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}</span></span>
<span style="font-weight: normal;"><span style="font-size:18px;">#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
#define esp 1e-12
using namespace std;
int s[10];
bool vis[10],flag;
int ans;
int cal(int a,int b,int j) //分别进行三种运算
{
if(j==0)
return a+b;
else if(j==1)
return a-b;
else
return a*b;
}
bool dfs(int cnt) //形参是指进行完运算后的结果
{
ans=0;
for(int i=0; i<5; i++)
if(vis[i])
ans++;
if(cnt==23&&ans==5) //如果结果是23且进行运算的数是5个则返回真
{
flag=true;
return 1;
}
for(int i=0; i<5; i++) //开始枚举下一个数
{
if(!vis[i])
{
vis[i]=true; //进行标记
for(int j=0; j<3; j++) //枚举三种运算
{
if(dfs(cal(cnt,s[i],j)))
return 1;
}
vis[i]=false; //取消标记,对于dfs来说,dfs前进行标记,dfs后取消标记
}
}
return 0;
}
int main()
{
//freopen("lalala.text","r",stdin);
while(~scanf("%d %d %d %d %d",&s[0],&s[1],&s[2],&s[3],&s[4]))
{
flag=false;
for(int i=0; i<5; i++) //枚举每个数当起点
{
memset(vis,0,sizeof(vis)); //清空标记数组
vis[i]=true; //把本身标记上
if(dfs(s[i])) //从本身开始搜
break;
}
if(flag)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}</span></span>