题意:从给定的n个正整数中选出m个数(m <= n)使得这m个数的和为给定的total

解法:回溯

/* Author: ACb0y Date: 2010-11-11 ProblemId: hdu 1258 Sum It Up Result: 3181578 2010-11-11 20:42:18 Accepted 1258 0MS 368K 1461 B G++ ACb0y */ #include <iostream> #include <algorithm> #include <set> #include <string> using namespace std; int total, n; int data[15]; int ans[15]; int vis[15]; //使用set判重 set<string> s; int Count; bool cmp(int a, int b) { return a > b; } string digit_to_str(int d) { string temp = ""; char c; if (d == 0) { return "0"; } else { while (d != 0) { c = d % 10 + '0'; temp = c + temp; d /= 10; } } return temp; } void dfs(int pos, int sum) { int i, j; if (sum == total && pos != 0) { string temp = ""; for (i = 0; i < pos; ++i) { if (i == 0) { temp = digit_to_str(ans[i]); } else { temp = temp + "+" + digit_to_str(ans[i]); } } if (s.find(temp) == s.end()) { cout << temp << endl; Count++; s.insert(temp); } return; } else { for (i = pos; i < n; ++i) { if ((!vis[i] && sum + data[i] <= total && data[i] <= ans[pos - 1]) || pos == 0) { vis[i] = 1; ans[pos] = data[i]; dfs(pos + 1, sum + data[i]); vis[i] = 0; } } } } int main() { #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); #endif int i, j; int sum; while (scanf("%d%d", &total, &n) != EOF) { if (n == 0) { break; } else { for (i = 0; i < n; ++i) { scanf("%d", &data[i]); } } cout << "Sums of " << total << ":" << endl; sort(data, data + n, cmp); memset(vis, 0, sizeof(vis)); s.clear(); Count = 0; dfs(0, 0); if (Count == 0) { cout << "NONE" << endl; } } return 0; }

hdu 1258 Sum It Up(回溯算法)相关推荐

  1. HDU 1258 Sum It Up

    这题郁闷了,排序过不了,后来仔细想想不用排序, 于是果断删了,没想到删了再杭电能过,在北大不能过,真郁闷了 这题是以简单DFS,在搜到时把结果存起来,然后再暴力搜索,看是否已存在这样的sum,最后一次 ...

  2. hdu 1258...... Sum It Up 搜索

    这个题又是传说中一个代码6题的那种题. 在vjudge上可以看到6道一毛一样的题. 题面 给两个数t,n和n(不超过12)个正整数,求出所有不同子集,使得它们加起来等于t,输出这些子集. 没有答案pu ...

  3. sum 去重_总结leetcode上【排列问题】【组合问题】【子集问题】回溯算法去重的两种写法!...

    本周小结!(回溯算法系列三)续集 在 本周小结!(回溯算法系列三) 中一位录友对 整颗树的本层和同一节点的本层有疑问,也让我重新思考了一下,发现这里确实有问题,所以专门写一篇来纠正,感谢录友们的积极交 ...

  4. 回溯算法——算法总结(四)

    回溯算法也叫试探法,它是一种系统地搜索问题的解的方法.回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试.用回溯算法解决这个问题的一般步骤为: 1.定义一个解空间.它包括问题 ...

  5. Python 回溯算法

    回溯算法(试探法) 在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就"回溯"返回,尝试别的路径.回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标.但当探索到某一步时 ...

  6. 求n个数中第k大的数_互联网高频面试题目:「回溯算法」求组合总和

    我将算法学习相关的资料已经整理到了Github :https://github.com/youngyangyang04/leetcode-master,里面还有leetcode刷题攻略.各个类型经典题 ...

  7. 113. 路径总和 (剑指 Offer 34. 二叉树中和为某一值的路径)(回溯算法)

    给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径. 叶子节点 是指没有子节点的节点. 示例 1: 输入:root = [ ...

  8. 高级数据结构与算法 | 回溯算法(Back Tracking Method)

    文章目录 回溯 电话号码的字母组合 二进制手表 组合总数 全排列 活字印刷 N皇后 N皇后II 回溯 回溯是一种通过穷举所有可能情况来找到所有解的算法.如果一个候选解最后被发现并不是可行解,回溯算法会 ...

  9. 回溯算法之幸运的袋子

    解法框架 [README]回溯算法基本框架 幸运的袋子(点击跳转) 这道题基本也是回溯,题解中有一部分提到了dfs,其实dfs本质也是回溯算法.这道题有点特别,除了考察算法外,还轻微涉及一点数学知识, ...

最新文章

  1. 微服务项目用了几台服务器,微服务部署运维
  2. 十厂商发起成立软件自律联盟
  3. linux服务 Systemd 简介
  4. 进程初识和multiprocessing模块之Process
  5. 九章算法班L3 Dynamic Programming Ⅰ
  6. LiveVideoStackCon深圳 - VR/AR基础技术更成熟
  7. [No0000111]java9环境变量配置bat
  8. python setup_简述python setup.py install的过程
  9. 利用border设置transparent绘制图形
  10. C#生成GS1码制二维码
  11. 巨佬Jake Wharton谈Android对Java 8的支持
  12. react ts版 组件封装总结
  13. “快播时代”终结:清内容、关服务器!
  14. pc机安装android,4种在PC机上运行Android系统的方法
  15. 使用tushare获取美股月收盘价
  16. 01Linux常用指令
  17. c语言 求单元格中间某段字符串,EXCEL怎么取单元格里面的的值的中间某些字符...
  18. 关于网络下载的记忆碎片
  19. APP自动化遇到问题总结-持续更新
  20. Python简单实现microbit传球小游戏

热门文章

  1. 高频快速复习:幅度调制
  2. 古希腊神话故事8 :彭透斯
  3. java soap 解析,java 解析soap
  4. 轻量级人脸识别算法之DBFace
  5. Swagger2离线文档:swagger2markup代码和插件方式
  6. 验证码识别软件的六大钻石亮点!
  7. Potsdam,Vaihingen数据集(附百度网盘下载地址)
  8. PAT日志 1145
  9. [mysql]数据迁移之data目录复制方法
  10. 某医院访问医保系统慢流量分析案例