Additive equations(和式)

zoj 1204

题目大意:给出一些数字,求出某几个数字之和等于给出的某一个数字 ,并按照要求输出

解决: 排序,dfs

#include <iostream>

#include <cstdio>

#include <cstring>

#include <algorithm>

using namespace std;

int num[35];

bool flag;

int res[35],n;



void dfs(int start,int dest_deep,int current_deep,int current_sum)

{

    if(current_deep==dest_deep)

    {

        if(binary_search(num,num+n,current_sum))

        {

            printf("%d",res[0]);

            for(int i=1;i<dest_deep;i++)

            printf("+%d",res[i]);

            printf("=%d\n",current_sum);

            flag=true;

        }

    }

    else 

    {

        for(int i=start;i<n-1;i++)

        {//下边这个if判断使得超时的程序,变为150ms,差别就是这么明显

            if(current_sum+num[i]<=num[n-1])

            {

                res[current_deep]=num[i];

                dfs(i+1,dest_deep,current_deep+1,current_sum+num[i]);

            }//下边这个else break语句使得删除后310ms变为150ms,剪枝是多么重要啊

            else break;

        }

    }

}

int main()

{

    int i,j,k,icase;

    scanf("%d",&icase);

    while(icase--)

    {

        scanf("%d",&n);

        for(i=0;i<n;i++)scanf("%d",&num[i]);

        sort(num,num+n);

        flag=false;

        for(int step=2;step<n;step++)

        {//step表示多少个数的和,从2......n-1

            dfs(0,step,0,0);

        }

        if(!flag)puts("Can't find any equations.");

        printf("\n");

    }

//    system("pause");

    return 0;

}

你可能感兴趣的:(add)