==========================================================
我想到的是这是一道搜索题,要求在其中插入一个等号和任意数量的加号使其构成一个等式,
那么在没有加入等号之前每一个间隙中可以有三种选择,一个是插入=,一个是什么都不插入,还有就是插入+,如果已经插入了等号了那么后面的间隙出就只能插入+或者什么都不插入了。
可是使用剪枝,减少不必要的搜索,从而提高运行的速度。由于所有的数字都是1到9之间的,假设在前k(k<n)个数据中等号左边的数据的和已经小于等号右边的数据的和了那么这时候这个等式必然是不能得到满足的,于是可以剪枝。
好了,说得太多也不好,还是直接给出程序代码,大家自己好好理解吧。
#include <cstdio> #include <algorithm> #include <math.h> using namespace std; int val[20]; int n,k; int tot = 0; void search2(int ni,int lsum,int rsum,bool hasEqual) { if(ni>n) { lsum==rsum?tot++:1; return; } if(lsum<=rsum)//剪枝条件可以放在这里会有很大的功效 return; if(hasEqual==false) { //operator + search2(ni+1,lsum+val[ni],rsum,false); //operator = search2(ni+1,lsum,val[ni],true); //no operator search2(ni+1,lsum*10+val[ni],rsum,false); } else{ //operator+ search2(ni+1,lsum,rsum+val[ni],true); //no operator search2(ni+1,lsum,rsum*10+val[ni],true); } } int main() { while(true) { scanf("%d",&n); tot=0; for(int i=1;i<=n;i++) scanf("%d",val+i); search2(2,val[1],0,false); printf("%d\n",tot); } return 0; }
原文地址:http://blog.csdn.net/qiuzhijieluojianping/article/details/44132329