• ZOJ 1204:(DFS)


    输出一串数所能构成的所有等式,按照加数从大到小,算式从长到短排列

    一开始因为无法按照要求输出纠结了好一阵~~最后看了大神的代码才发现只需要每次dfs规定长度就好了~

    #include"cstdio"
    #include"cstring"
    #include"algorithm"
    #define MAXN 40
    using namespace std;
    int num[MAXN],n,front,rear,ok;
    int stack[MAXN];
    int cal()
    {   int sum=0;
        for(int i=front;i<rear;i++)
            sum+=stack[i];
        return sum;
    }
    void display()
    {   for(int i=front;i<rear-1;i++)
            printf("%d+",stack[i]);
        printf("%d=%d
    ",stack[rear-1],cal());
    }
    bool find(int x)
    {   int low=0,high=n-1,mid;
        while(high>=low)
        {   mid=low+(high-low)/2;
            if(num[mid]==x) return true;
            else if(num[mid]>x) high=mid-1;
            else low=mid+1;
        }
        return false;
    }
    void dfs(int mark,int len)
    {   for(int i=mark+1;i<n;i++)
        {   if(i<n&&cal()+num[i]<=num[n-1])
            {   stack[rear++]=num[i];
                if(rear-front==len&&find(cal())) {display();ok=0;}
                else dfs(i,len);
                rear--;
            }
        }
    }
    int main()
    {   int t;
        scanf("%d",&t);
        while(t--)
        {   ok=1;
            memset(stack,0,sizeof(stack));
            memset(num,0,sizeof(num));
            scanf("%d",&n);
            for(int i=0;i<n;i++) scanf("%d",&num[i]);
            sort(num,num+n);
            for(int len=2;len<=n;len++)
            for(int i=0;i<n;i++) {front=rear=0;stack[rear++]=num[i];dfs(i,len);}
            if(ok) printf("Can't find any equations.
    
    ");
            else printf("
    ");
        }
        return 0;
    }
    View Code
  • 相关阅读:
    文件的权限
    正则表达式
    软硬链接的学习
    linux系统中的文件类型和扩展名
    把数组排成最小的数
    整数中1出现的次数(从1到n整数中1出现的次数)
    最小的K个数
    连续子数组的最大和
    数组中出现次数超过一半的数字
    字符串的排列
  • 原文地址:https://www.cnblogs.com/luxiaoming/p/4671058.html
Copyright © 2020-2023  润新知