zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    FZU 1894 志愿者选拔
    POJ 2823 Sliding Window
    POJ 3038 Flying Right
    xStream 的简单使用 xml to bean
    欧拉函数
    POJ题目分类
    POJ1039 Pipe
    linux进程间通信之消息队列
    欧几里得GCD及扩展
    win7的vmware中安装ubuntu 13.04看不到共享目录
  • 原文地址:https://www.cnblogs.com/zhurb/p/5839756.html
Copyright © 2011-2022 走看看