没什么可以优化的,按照题意进行深搜。注意,退出输入的条件不是-1,是n<0.
我写的深搜太丑了,原本思路是弄成逆波兰表达式再求解。。。
后来江大神 给了他AC的深搜代码给我看,然后涨见识了!!
AC代码如下:
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
const int maxn = 20;
int n;
ll sum;
ll a[maxn];
char c[maxn];
bool dfs(int id, ll ans, ll x){
if (id==n+1) return sum==(ans+x);
c[id]='+';
if (dfs(id+1,ans+x,a[id])) return 1;
c[id]='-';
if (dfs(id+1,ans+x,-a[id])) return 1;
c[id]='*';
if (dfs(id+1,ans,x*a[id])) return 1;
c[id]='/';
if (a[id] && x%a[id]==0 && dfs(id+1,ans,x/a[id])) return 1;
return 0;
}
void Print(){
printf("%lld = %lld",sum,a[1]);
for (int i=2; i<=n; i++) printf(" %c %lld",c[i],a[i]);
printf("\n");
}
int main(){
while (scanf("%d",&n) && n>0){
scanf("%lld",&sum);
for (int i=1; i<=n; i++) scanf("%lld",&a[i]);
dfs(2,0,a[1]);
Print();
}
return 0;
}