http://acm.nyist.net/JudgeOnline/problem.php?pid=43
分析:因为精度改了一天,我说怎么看逻辑都没有问题……
加、减、乘、除、被加、被减,然后遍历
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int NM=15;
const double eps=1e-6;
bool vis[NM],flag;
double a[NM];
int n,m,k;
void DFS(double ans,int num){
if(flag) return;
if(num==n){
if(fabs(ans-m)<eps) //!!
flag=true;
return;
}
for(int i=1;i<=n;i++){
if(!vis[i])
{
vis[i]=1;
if(num==0) DFS(a[i],num+1);
else{
for(int j=0;j<6;j++){
switch(j)
{
case 0:DFS(ans+a[i],num+1);break;
case 1:DFS(ans*a[i],num+1);break;
case 2:DFS(ans-a[i],num+1);break;
case 3:DFS(a[i]-ans,num+1);break;
case 4:if(a[i]!=0) DFS(ans/a[i],num+1);break;
case 5:if(ans!=0) DFS(a[i]/ans,num+1);break;
}
}
}
vis[i]=0; //
}
}
}
int main()
{
int T,i;
scanf("%d",&T);
while(T--){
cin>>n>>m;
for(i=1;i<=n;i++) cin>>a[i];
flag=false;
DFS(0,0);
if(flag) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}