HDU 1258 DFS

这篇博客详细探讨了HDU 1258题目中如何运用深度优先搜索(DFS)解决相同数字的处理问题,深入解析了算法的实现和关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值