/******
首先说明题意,
1,就是根据 + - * / 和这几个数能否得到一个数
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
double a[10]; // 储存数据
int vis[100];
int n,m;
char s[10]; // 存储操作符
int fun() // 生成a[]的全排列,对于每一个s[],枚举所有的a[]排列;
{
do
{
double sum = a[0];
for(int i=0;i<n-1;i++)
if(s[i]=='+')
sum+=a[i+1];
else
if(s[i]=='-')
sum-=a[i+1];
else
if(s[i]=='*')
sum*=a[i+1];
else
if(s[i]=='/')
{
if(a[i+1]==0)break;
else
sum/=a[i+1];
}
int x = int(sum+0.5);
if(x==m){return 1;}
}while(next_permutation(a,a+n));
return 0;
}
int flog = 0;
void dfs(int count) // 生成操作符的全排列
{
if(count==4)
{
if(fun())flog = 1;
return ;
}
if(!vis[count])
{
vis[count] = 1;
s[count] = '+';
dfs(count+1);
s[count] = '-';
dfs(count+1);
s[count] = '*';
dfs(count+1);
s[count] = '/';
dfs(count+1);
vis[count] = 0;
}
}
int main()
{
int icase;
scanf("%d",&icase);
while(icase--)
{
flog = 0;
memset(vis,0,sizeof(vis));
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%lf",&a[i]);
sort(a,a+n);
dfs(0);
if(flog==1)puts("Yes");
else puts("No");
}
}
Nyoj 24 Point game dfs
最新推荐文章于 2019-11-07 19:52:28 发布