题目大意:输入一段数字,在这段数字中任意添加加号,减号,使其能够等于结果
思路:直觉上直接想到枚举尝试(类似于算24分,只不过牌变多了,运算规则变简单了),但是用过的牌(数字)不能重复使用,于是就可以用深搜解题。
搜的范围大概是:得到一个数字,1.该数字加到sum中 2.该数字和sum作差 3.该数字啥都不做进入下一个搜索(不做的话要把他成为数字的尾部)
附代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
char a[20];
int result,cnt;
void dfs(int k,int sum)
{
if(k==strlen(a))
{
if(sum==result)
cnt++;
return ;
}
int i,j,s;
for(i=k;i<strlen(a);i++) //从k处开始往后找
{
for(j=k,s=0;j<=i;j++) //从k处到i处算出那些没做加减的数的值
s=s*10+a[j]-'0';
dfs(i+1,sum+s);
if(k>0) //这个判断是必要的,因为当k为第一个数字时,不能做啥操作,即加号没影响,但减号有影响
dfs(i+1,sum-s);
}
return ;
}
int main()
{
while(~scanf("%s %d",a,&result))
{
cnt=0;
dfs(0,0);
printf("%d\n",cnt);
}
return 0;
}
二刷修改: #include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
char a[20];
int result,cnt;
void dfs(int k,int sum)
{
if(k==strlen(a))
{
if(sum==result)
cnt++;
return ;
}
int i,j,s=0;
for(i=k;i<strlen(a);i++) //从k处开始往后找
{
s=s*10+a[i]-'0';
dfs(i+1,sum+s);
if(k>0) //这个判断是必要的,因为当k为第一个数字时,不能做啥操作,即加号没影响,但减号有影响
dfs(i+1,sum-s);
}
return ;
}
int main()
{
while(~scanf("%s %d",a,&result))
{
cnt=0;
dfs(0,0);
printf("%d\n",cnt);
}
return 0;
}