ZOJ 1204 Additive equations

题目地址:点击打开链接

思路:先排序,再依次输出式子短的

AC代码:

#include <iostream>
#include<algorithm>

using namespace std;

int pos[31];
int a[31];
int flag,num,n;

void print(int sum)
{
    int i;
    for(i=pos[num-1]+1; i<n; i++)
    {
        if(sum == a[i])//判断求得的最大值是否存在
            break;
    }
    if(i < n)
    {
        flag = 1;
        for(i=0; i<num; i++)
        {
            if(i)
                cout<<"+";
            cout<<a[pos[i]];
        }
        cout<<"="<<sum<<endl;
    }
}
int search(int k,int sum)
{
    int b,i;
    if(k == num)
    {
        print(sum);
        return 1;
    }
    if(k == 0)
        b = 0;
    else
        b = pos[k-1] + 1;//从目前构成加法等式的最后一个元素往后搜
    for(i=b; i<n-1; i++)
    {
        pos[k] = i;
        if(sum + a[pos[k]] > a[n-1])//比最大值还大,停止搜索
            return 0;
        if(!search(k+1,sum+a[pos[k]]) && pos[k+1] - pos[k] == 1)//当相邻的2个元素的和都比最大值大,以后的数更比最大值大,停止搜索
            return 0;
    }
    return 1;
}
int main()
{
    int t,i;
    cin>>t;
    while(t--)
    {
        flag = 0;
        cin>>n;
        for(i=0; i<n; i++)
        {
            cin>>a[i];
        }
        sort(a,a+n);
        for(i=2; i<n; i++)
        {
            num = i;
            search(0,0);
        }
        if(!flag)
            cout<<"Can't find any equations."<<endl;
        cout<<endl;
    }
    return 0;
}


你可能感兴趣的:(ZOJ 1204 Additive equations)