• 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;
    }
  • 相关阅读:
    定义通用类型,便于移植和32位、64位的编译
    映射密码的加密,解密以及暴力破解
    位移密码的加密,解密以及暴力破解
    TCP三次握手和四次挥手通俗理解
    git常用命令
    pip及npm换源
    win10安装Docker并换国内源
    搜索引擎工作原理
    wsgi_uwsgi_nginx理论知识
    课程全文检索接口
  • 原文地址:https://www.cnblogs.com/zhurb/p/5839756.html
Copyright © 2020-2023  润新知