POJ_1564_dfs

Posted 冷暖知不知

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

 

以上是关于POJ_1564_dfs的主要内容,如果未能解决你的问题,请参考以下文章

POJ_1088_dfs

POJ_3984_迷宫问题 DFS

POJ_3279_(dfs)(状态)

POJ_1979_dfs

poj 1564 Sum It Up

POJ 3009 Curling 2.0冰壶游戏(dfs)