hdu 1258 Sum It Up(回溯算法)
题意:从给定的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(回溯算法)相关推荐
- HDU 1258 Sum It Up
这题郁闷了,排序过不了,后来仔细想想不用排序, 于是果断删了,没想到删了再杭电能过,在北大不能过,真郁闷了 这题是以简单DFS,在搜到时把结果存起来,然后再暴力搜索,看是否已存在这样的sum,最后一次 ...
- hdu 1258...... Sum It Up 搜索
这个题又是传说中一个代码6题的那种题. 在vjudge上可以看到6道一毛一样的题. 题面 给两个数t,n和n(不超过12)个正整数,求出所有不同子集,使得它们加起来等于t,输出这些子集. 没有答案pu ...
- sum 去重_总结leetcode上【排列问题】【组合问题】【子集问题】回溯算法去重的两种写法!...
本周小结!(回溯算法系列三)续集 在 本周小结!(回溯算法系列三) 中一位录友对 整颗树的本层和同一节点的本层有疑问,也让我重新思考了一下,发现这里确实有问题,所以专门写一篇来纠正,感谢录友们的积极交 ...
- 回溯算法——算法总结(四)
回溯算法也叫试探法,它是一种系统地搜索问题的解的方法.回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试.用回溯算法解决这个问题的一般步骤为: 1.定义一个解空间.它包括问题 ...
- Python 回溯算法
回溯算法(试探法) 在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就"回溯"返回,尝试别的路径.回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标.但当探索到某一步时 ...
- 求n个数中第k大的数_互联网高频面试题目:「回溯算法」求组合总和
我将算法学习相关的资料已经整理到了Github :https://github.com/youngyangyang04/leetcode-master,里面还有leetcode刷题攻略.各个类型经典题 ...
- 113. 路径总和 (剑指 Offer 34. 二叉树中和为某一值的路径)(回溯算法)
给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径. 叶子节点 是指没有子节点的节点. 示例 1: 输入:root = [ ...
- 高级数据结构与算法 | 回溯算法(Back Tracking Method)
文章目录 回溯 电话号码的字母组合 二进制手表 组合总数 全排列 活字印刷 N皇后 N皇后II 回溯 回溯是一种通过穷举所有可能情况来找到所有解的算法.如果一个候选解最后被发现并不是可行解,回溯算法会 ...
- 回溯算法之幸运的袋子
解法框架 [README]回溯算法基本框架 幸运的袋子(点击跳转) 这道题基本也是回溯,题解中有一部分提到了dfs,其实dfs本质也是回溯算法.这道题有点特别,除了考察算法外,还轻微涉及一点数学知识, ...
最新文章
- 微服务项目用了几台服务器,微服务部署运维
- 十厂商发起成立软件自律联盟
- linux服务 Systemd 简介
- 进程初识和multiprocessing模块之Process
- 九章算法班L3 Dynamic Programming Ⅰ
- LiveVideoStackCon深圳 - VR/AR基础技术更成熟
- [No0000111]java9环境变量配置bat
- python setup_简述python setup.py install的过程
- 利用border设置transparent绘制图形
- C#生成GS1码制二维码
- 巨佬Jake Wharton谈Android对Java 8的支持
- react ts版 组件封装总结
- “快播时代”终结:清内容、关服务器!
- pc机安装android,4种在PC机上运行Android系统的方法
- 使用tushare获取美股月收盘价
- 01Linux常用指令
- c语言 求单元格中间某段字符串,EXCEL怎么取单元格里面的的值的中间某些字符...
- 关于网络下载的记忆碎片
- APP自动化遇到问题总结-持续更新
- Python简单实现microbit传球小游戏