POJ_1564_dfs

题目描述:

  每组数据给定一个大的数,和一系列降序的数值,要求列出不重复的数值中挑选的数的和为大数的方案,每一种方案里,每个数值最多只能使用一次。

思路:

  dfs基础题,每次记录大数和当前总和的差值,当前位置,以及当前使用的数的数量,将每一个使用的数放进ans数组中。由于是dfs,每一种情况使用的数字放入ans中可以将上一种情况覆盖,所以不需要考虑初始化。

  要注意的是,方案不能重复,所以每一层dfs中,下一个数值的选择必须是不重复的。

#include<cstdio>
#include<iostream>
using namespace std;

int t,n,x[15],flag,ans[15];

void dfs(int un_sum,int where,int num)
{
    if(!un_sum)
    {
        cout << ans[1];
        for(int i = 2;i < num;i++)  cout << '+' << ans[i];
        cout << endl;
        flag = 0;
        return;
    }
    else if(where > n)
    {
        return;
    }
    ans[num] = x[where];
    dfs(un_sum-x[where],where+1,num+1);
    for(int i = where+1;i <= n;i++)
    {
        if(x[i] != x[i-1] && un_sum >= x[i])
        {
            ans[num] = x[i];
            dfs(un_sum-x[i],i+1,num+1);
        }
    }
}
int main()
{
    while(cin >> t >> n && t && n)
    {
        flag = 1;
        for(int i =1;i <= n;i++)    cin >> x[i];
        cout << "Sums of " << t << ':' << endl;
        for(int i = 1;i <= n;i++)
        {
            if(t >= x[i])
            {
                dfs(t,i,1);
                break;
            }
        }
        if(flag)    cout << "NONE" << endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zhurb/p/5839756.html