链接:http://codeforces.com/gym/100989/problem/L
题意:给出一个只含加减运算符的算术表达式,让你修改运算符,使得算术表达式的运算结果为0,求出最少修改运算符的次数,如果无法使表达式为0,则输出-1。
解题思路:用DFS,遍历所有情况,如果无法实现,输出-1,否则输出最少修改运算符的次数。
#include<stdio.h>
#include<iostream>
using namespace std;
int n,s[25];
int sum=50,cnt=0,flag=0;
int dfs(int S,int Path,int cnt)
{
if(Path==n-1)
{
if(S==0)
{
flag=1;
sum=min(sum,cnt);
}
return 0;
}
dfs(S+s[Path+1],Path+1,cnt);
dfs(S-s[Path+1],Path+1,++cnt);
return 0;
}
int main()
{
char a;
int i,b;
cin>>n;
cin>>s[0];
for(i=1;i<=n-1;i++)
{
cin>>a>>b;
if(a=='+')
s[i]=b;
else
s[i]=-b;
}
dfs(s[0],0,0);
if(flag)
cout<<sum<<endl;
else
cout<<"-1"<<endl;
return 0;
}