2018-暑假留校训练题目

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;
}

  

猜你喜欢

转载自www.cnblogs.com/caijiaming/p/9274364.html
今日推荐