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

原文地址:https://www.cnblogs.com/hpustudent/p/2132128.html