现在的位置: 首页 > 综合 > 正文

HDU 1258 DFS

2013年04月03日 ⁄ 综合 ⁄ 共 760字 ⁄ 字号 评论关闭

要注意的就是 处理 相同的数字;

/*
 *HDU 1258
 *fuqiang11
 *DFS
 *2013/7/28
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#define maxn 13
using namespace std;

int T,N;
int a[maxn];
int visit[maxn];
int flag;

int cmp(int x, int y)
{
    return x > y;
}

void DFS(int sum, int pos)
{
    if(sum == T)
    {
        flag = 1;
        int p = 0;
        for(int i = 1; i <= N; i++)
        {
            if(visit[i]==1)
            {
                if(p)
                    cout<<"+";
                cout<<a[i];
                p = 1;
            }
        }
        cout<<endl;
        return ;
    }
    for(int i = pos; i <= N; i++)
    {
        if(visit[i]==0 && sum + a[i] <= T)
        {
            visit[i] = 1;
            DFS(sum+a[i],i+1);
            visit[i] = 0;
        }
        while(i<=N && a[i]==a[i+1])
            i++;
    }
}
int main()
{
#ifndef ONLINE_JUDGE
    freopen("in","r",stdin);
#endif
    while(cin>>T && T)
    {
        cin>>N;
        memset(visit, 0, sizeof(visit));
        for (int i = 1; i <= N; i++)
        {
            cin>>a[i];
            if(a[i] > T)
                visit[i] = -1;
        }
        cout<<"Sums of "<<T<<":"<<endl;
        flag = 0;
        sort(a+1,a+N+1,cmp);
        DFS(0,1);
        if(!flag)
            cout<<"NONE"<<endl;
    }
}

抱歉!评论已关闭.