I - 深搜 基础

Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u

Submit Status

Description

Given a specified total t and a list of n integers, find all distinct sums using numbers from the list that add up to t. For example, if t = 4, n = 6, and the list is [4, 3, 2, 2, 1, 1], then there are four different sums that equal 4: 4, 3+1, 2+2, and 2+1+1. (A number can be used within a sum as many times as it appears in the list, and a single number counts as a sum.) Your job is to solve this problem in general.

Input

The input will contain one or more test cases, one per line. Each test case contains t, the total, followed by n, the number of integers in the list, followed by n integers x 1 , . . . , x n . If n = 0 it signals the end of the input; otherwise, t will be a positive integer less than 1000, n will be an integer between 1 and 12 (inclusive), and x 1 , . . . , x n will be positive integers less than 100. All numbers will be separated by exactly one space. The numbers in each list appear in nonincreasing order, and there may be repetitions.

Output

For each test case, first output a line containing `Sums of', the total, and a colon. Then output each sum, one per line; if there are no sums, output the line `NONE'. The numbers within each sum must appear in nonincreasing order. A number may be repeated in the sum as many times as it was repeated in the original list. The sums themselves must be sorted in decreasing order based on the numbers appearing in the sum. In other words, the sums must be sorted by their first number; sums with the same first number must be sorted by their second number; sums with the same first two numbers must be sorted by their third number; and so on. Within each test case, all sums must be distinct; the same sum cannot appear twice.

Sample Input

4 6 4 3 2 2 1 1
5 3 2 1 1
400 12 50 50 50 50 50 50 25 25 25 25 25 25
0 0

Sample Output

Sums of 4:
4
3+1
2+2
2+1+1
Sums of 5:
NONE
Sums of 400:
50+50+50+50+50+50+25+25+25+25
50+50+50+50+50+25+25+25+25+25+25

题意比较好懂,解析见代码
代码:
/*
 hdu1258
dfs,小数据,dfs暴力搜一遍即可,之前一直做一些图的题目,这算是做的
第一道比较抽象的dfs题目,dfs最重要的思想是递归与回溯来实现状态的转移,是
一种暴力的搜索手段,适用于小数据的情况
*/
#include<iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
#include <stack>
using namespace std;
const int maxn=15;
const double epi=1e-8;
const double pi=acos(-1.0);
int a[maxn],b[maxn];
bool v[maxn];//标记数组,避免在一次搜索中重复搜索
int tar,n;
bool flag;
void dfs(int sum,int pos,int ans)//三个参数,sum代表当前层计数总和,判断递归是否结束的标志,pos储存下一次从哪一个位置开始搜索
{
    int i;
    if(sum>tar) return;
    if(sum==tar)
    {
        flag=true;
        for(int i=1;i<=ans;i++)
      printf((i==ans)?"%d\n":"%d+",b[i]);//输出注意格式
    }
    int last=-1;
    for(i=pos+1;i<=n;i++)
    {
        if(!v[i]&&a[i]!=last)
        {
            b[ans+1]=a[i];
            last=a[i];
            v[i]=true;
            dfs(sum+a[i],i,ans+1);
            v[i]=false;
        }
    }
}
int main()
{
    while(scanf("%d%d",&tar,&n)&&(tar||n))
    {
        for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
        memset(v,false,sizeof(v));
        cout<<"Sums of "<<tar<<":"<<endl;
        flag=false;//判断是否找到答案
        dfs(0,0,0);
        if(!flag)
            cout<<"NONE"<<endl;
    }
}

hdu 1258 DFS的更多相关文章

  1. poj1564 Sum It Up (zoj 1711 hdu 1258) DFS

    POJhttp://poj.org/problem?id=1564 ZOJhttp://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=711 ...

  2. HDOJ(HDU).1258 Sum It Up (DFS)

    HDOJ(HDU).1258 Sum It Up (DFS) [从零开始DFS(6)] 点我挑战题目 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双 ...

  3. HDU 5143 DFS

    分别给出1,2,3,4   a, b, c,d个 问能否组成数个长度不小于3的等差数列. 首先数量存在大于3的可以直接拿掉,那么可以先判是否都是0或大于3的 然后直接DFS就行了,但是还是要注意先判合 ...

  4. Snacks HDU 5692 dfs序列+线段树

    Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...

  5. hdu 1258 Sum It Up(dfs+去重)

    题目大意: 给你一个总和(total)和一列(list)整数,共n个整数,要求用这些整数相加,使相加的结果等于total,找出所有不相同的拼凑方法. 例如,total = 4,n = 6,list = ...

  6. HDU 1258 Sum It Up(dfs 巧妙去重)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1258 Sum It Up Time Limit: 2000/1000 MS (Java/Others) ...

  7. hdu 2266 dfs+1258

    How Many Equations Can You Find Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 ...

  8. hdu 1258 Sum It Up (dfs+路径记录)

    pid=1258">Sum It Up Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  9. (step4.3.4)hdu 1258(Sum It Up——DFS)

    题目大意:输入t,n,接下来有n个数组成的一个序列.输出总和为t的子序列 解题思路:DFS 代码如下(有详细的注释): #include <iostream> #include <a ...

随机推荐

  1. unresolved import 解决办法

    安装paramiko 需要先安装另两个模块 安装时未注意32bit,安装了64的,本地python是32的所以出错,重装后报错unresolved import,环境是eclipse(pydev) 用 ...

  2. 如何监听input的脚本赋值

    今天记录下我解决input值改变监听,大家肯定首先想到onchange方法.对于实时监听改变用onpropertychange.oninput等方法:可是,onchange并不能监听脚本改变的值,对于 ...

  3. Oracle RAC 环境下的连接管理

    http://blog.csdn.net/cyxlxp8411/article/details/7634003

  4. Windows 8.1 explorer.exe总是崩溃的解决办法

    方法1 卸载此补丁 KB3033889 方法2 打补丁, 更新 3033889 导致使用日语. 朝鲜语和中文输入法的系统中 Windows 资源管理器停止响应 https://support.micr ...

  5. SRM 597DIV1

    250: 首先先特判答案不存在的情况. 再设答案为k,则B[k+1,n]是A的一个子序列,所以, 做法1,枚举k检查子序列是否成立; 做法2,反过来想,从后往前看,最长的一个子序列对应了最小答案. 6 ...

  6. [置顶] 单片机C语言易错知识点经验笔记

    今天写这一篇文章并不是因为已经想好了一篇文章才写下来,而是我要将这一篇文章作为一个长期的笔记来写,我会一直更新.在进行单片机开发时,经常都会出现一些很不起眼的问题,这些问题其实都是很基础的c语言知识点 ...

  7. phpcms:四、尾部包含

    四.尾部包含1.包含尾部文件:{template "content","footer"}2.栏目列表调用(关于我们| 联系方式| 版权声明| 招聘信息|):{p ...

  8. Android 读取手机SD卡根目录下某个txt文件的文件内容

    1.先看activity_main.xml文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/and ...

  9. 用java流方式判断文件类型

    这个方法只能在有限的范围内有效.并不是万金油 比如 图片类型判断,音频文件格式判断,视频文件格式判断等这种肯定是2进制且专业性很强的文件类型判断. 下面给出完整版代码 首先是文件类型枚取 packag ...

  10. css如何使背景图片水平居中

    CSS中定位背景图片的属性是:background-position,用法background-position 属性设置背景图像的起始位置. 你要水平居中可以: div{background-pos ...