题目大意:

  给你一个总和(total)和一列(list)整数,共n个整数,要求用这些整数相加,使相加的结果等于total,找出所有不相同的拼凑方法。

  例如,total = 4,n = 6,list = [4,3,2,2,1,1]。

  有四种不同的方法使得它们相加的结果等于total(即等于4),分别为:4,3+1,2+2, 2+1+1。

  在同一种拼凑方式中,每个数字不能被重复使用,但是在list中可能存在许多相等的数字。

输入:

  输入包含许多测试用例,每个用例仅占一行。每个用例包含t(total),接下来是n,接着是用空格隔开的n个整数。如果n等于零,表示输入结束。t∈(0,1000),n∈[1, 12],list中的每个整数∈[1, 100],list中的数字是以降序排列,数字中可能出现重复的数字。

输出:

  每个测试用例,第一行输出“Sums of [total的值]:”,接下每一行输出一个结果集,如果一个结果集都没有则输出“NONE”。每个结果集要按照降序输出,并且结果集之间也要按照降序排序,结果集之间的比较从第一个数字开始,数字大的结果集大,如果第一个数字相同,则比较第二个数字,第二个数字大的,则结果集大,如果第二个数字也相同,则比较第三个数字,以此类推。不能出现相同的结果集。

解题思路:

  类似hdu 1455 Sticks,但是比1455简单的多。搞一个数组记录结果集,每次搜索到结果的时候,就输出结果集,由于list是降序的,并且数字可能在list中重复出现,因此回溯的时候记得去掉重复的结果集。

AC代码:

  1. //19475530 2017-01-02 21:07:46 Accepted 1258 0MS 1720K 1332 B C++ 潮州牛肉丸
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. int total; // the list that add up to total. t < 1000
  6. int n; // list中元素个数
  7. int list[]; // 记录数字 list[x] ∈ (0, 100)
  8. bool visit[]; // 判重
  9.  
  10. int result[]; // 记录结果集
  11. int count; // 记录result中的元素个数
  12. int flag; // 记录是否搜索到结果,一次都没有搜索到则为false
  13.  
  14. void init(void)
  15. {
  16. count = ;
  17. flag = false;
  18. memset(list, 0x00, sizeof(list));
  19. memset(visit, 0x00, sizeof(visit));
  20. }
  21.  
  22. // sum:当前累加和,index:上一次搜索到的下标位置
  23. void dfs(int sum, int index)
  24. {
  25. if (total == sum)
  26. {
  27. // 输出结果集
  28. flag = true;
  29. printf("%d", result[]);
  30. for (int i = ; i < count; ++i)
  31. printf("+%d", result[i]);
  32. printf("\n");
  33. return;
  34. }
  35.  
  36. for (int i = index + ; i < n; ++i)
  37. {
  38. if (true == visit[i])
  39. continue;
  40.  
  41. if (list[i] + sum <= total)
  42. {
  43. result[count++] = list[i];
  44. visit[i] = true;
  45. dfs(list[i] + sum, i);
  46. visit[i] = false;
  47. count--;
  48.  
  49. // 关键:去掉重复的结果集
  50. while (i < n && list[i] == list[i + ]) ++i;
  51. }
  52. }
  53. return;
  54. }
  55.  
  56. int main(void)
  57. {
  58. while (scanf("%d %d", &total, &n) != EOF && != n)
  59. {
  60. init();
  61. for (int i = ; i < n; ++i)
  62. scanf("%d", &list[i]);
  63.  
  64. printf("Sums of %d:\n", total);
  65. dfs(, -);
  66. if (false == flag)
  67. printf("NONE\n");
  68. }
  69. return ;
  70. }

hdu 1258 Sum It Up(dfs+去重)的更多相关文章

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

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

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

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

  3. HDU 1258 Sum It Up(DFS)

    题目链接 Problem Description Given a specified total t and a list of n integers, find all distinct sums ...

  4. 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) ...

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

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

  6. HDU 1258 Sum It Up (DFS)

    Sum It Up Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total S ...

  7. HDU 1258 Sum It Up

    Sum It Up Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total S ...

  8. HDOJ(HDU).1016 Prime Ring Problem (DFS)

    HDOJ(HDU).1016 Prime Ring Problem (DFS) [从零开始DFS(3)] 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架 ...

  9. HDU 1241 Oil Deposits --- 入门DFS

    HDU 1241 题目大意:给定一块油田,求其连通块的数目.上下左右斜对角相邻的@属于同一个连通块. 解题思路:对每一个@进行dfs遍历并标记访问状态,一次dfs可以访问一个连通块,最后统计数量. / ...

随机推荐

  1. 【转载】变更MySql数据存储路径的方法

    1.在mysql安装目录下找到my.ini文件,更改#Path to the database root datadir="希望存放数据的地址" 2.将默认存放路径(一般为&quo ...

  2. 使用Struts2搭建登录注册示例

    使用Struts2来搭建mvc网站框架还是比较容易的,Struts2提供了各项辅助功能,保证了web开发的快速方便.下面使用struts2来搭建一个登录注册示例. 0 项目结构截图 1 搭建Strut ...

  3. neutron floatingip-delete

  4. C语言dsPIC / PIC24 serial bootloader和C#语言bootloader PC端串口通信程序

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 新dsPIC/PIC2 ...

  5. xhprof学习笔记

    一.简介 XHProf 是一个轻量级的分层性能测量分析器. 在数据收集阶段,它跟踪调用次数与测量数据,展示程序动态调用的弧线图. 它在报告.后期处理阶段计算了独占的性能度量,例如运行经过的时间.CPU ...

  6. mysql 模糊查询语句比较(LIKE、instr、locate、find_in_set、position)

    大家都知道mysql 模糊查询的常用方法是LIKE 但这个语句查询效率很慢,那么有没有比较好的方法呢,下面本人测试了几个语句 测试数据800条左右 1,

  7. 基于ADO.NET的SqlHelper类

    1.使用Connection连接数据库的步骤: (1).添加命名空间 System.Data.SqlClient(注意:初学者经常会忘记) (2)定义连接字符串.连接SQL Server 数据库时: ...

  8. php工作笔记2-php编码效率

    1.尽量静态化: 如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍.当然了,这个测试方法需要在十万级以上次执行,效果才明显.其实静态方法和非静态方法的效率 ...

  9. Hbase资料汇总

    1.hbase api http://blog.csdn.net/u010967382/article/details/37878701

  10. asp.net core 阿里云消息服务(Message Service,原MQS)发送接口的实现

    最近在后台处理订单统计等相关功能用到了大力的mqs,由于官方没有实现asp.net core的sdk,这里简单实现了发送信息的功能,有兴趣的可以参考实现其他相关功能 using System;usin ...