https://vjudge.net/contest/236677#problem/L
一直以为这道题是用什么数学方法或者什么策略来算,没想到直接简单DFS就出来了,枚举每个每个数的正负状态,如果有成功的就记录下来所改变的次数,取最小的
#include<iostream> #include<stdio.h> #include<string.h> #include<cmath> #include<math.h> #include<algorithm> typedef long long ll; using namespace std; int sum=0,n,flag=0,minn=100; int a[25]; void dfs(int len,int ti) { if(len==n+1) { for(int i=0;i<n;i++) sum+=a[i]; if(sum==0) { flag=1; if(ti<minn) minn=ti; return ; } else sum=0; } if(len<=n) { dfs(len+1,ti); a[len]=-a[len]; dfs(len+1,ti+1); a[len]=-a[len]; } } int main() { char c; scanf("%d",&n); scanf("%d",&a[0]); // sum+=a[0]; for(int i=1;i<n;i++) { scanf(" %c %d",&c,&a[i]); if(c=='-') a[i]=-a[i]; // sum+=a[i]; } /* for(int i=0;i<n;i++) printf("%d ",a[i]); return 0; */ // if(sum!=0) dfs(1,0); if(flag==0) printf("-1\n"); else printf("%d\n",minn); return 0; }