题目描述
Description
有一个未完成的等式:1 2 3 4 5 6 7 8 9=N 空格(1前面没有空格)内可以填入+,-,也可以不填。 编程找出输入某个整数 N 后使等式成立的所有方案的总数。保证有解。
输入描述
Input Description
输入一个数N。
输出描述
Output Description
输出一个数。所有的方案数。
样例输入
Sample Input
108
样例输出
Sample Output
15
详细思路及解释在代码内
代码:
#include<cstdio> using namespace std; int n,ans; void dfs(int sum,int k) { int t;//必须在里面定义,mdzz我在外面定义的,调了一个多小时,最后徐大佬跟我说在搜索回退的时候必须定义在里面。 if(k==10)//我们要在1~0之间加符号,所以可供我们发符号的地方只有9个,于是放倒9个,第10个还没放的时候,我们就已经放完了全部符号。 { if(sum==n) ans++; return; } for(int i=k;i<=9;i++)//循环枚举放符号的位置,只有9个地方可以放符号 { t=0;//初始化t=0 for(int j=k;j<=i;j++) t=t*10+j;//在这个地方我们所要的这个t为从让一次放符号的地方到这次放符号的位置所组成的整数 dfs(sum+t,i+1); if(k>1) dfs(sum-t,i+1);//搜索回退 } } int main() { scanf("%d",&n); dfs(0,1);//最开始时我们填入符号后的数为0,由于我们在上面从第几个数(1~0内的数)开始填符号 printf("%d",ans); return 0; }