回溯法应用:1,2,5,10四个数任意次数相加得到一个数N
来源:互联网 发布:淘宝女装2016top排行榜 编辑:程序博客网 时间:2024/06/05 18:02
#include <iostream> #include <vector> using namespace std; vector<int> vec; const int a[4] = {1, 2, 5, 10}; void backup(int N) { if (N == 0) { vector<int>::iterator it = vec.begin(); for (; it != vec.end(); ++it) cout<< *it <<" "; cout<<endl; return; } if (N < 0) return; for (int i = 0; i < 4; ++i) { if (vec.empty() || a[i] >= vec.back())// 非降序,为了去掉重复的组合 { vec.push_back(a[i]); backup(N-a[i]); vec.pop_back(); } } } int main(int argc, char* argv[]) { backup(20); return 0; }
或者
#include <iostream>#include <string> using namespace std;int count = 0;void printAll(int* a, int n, int diff, int* path, int cur){ if(diff == 0) { count++; for(int i = 0; i < cur; i++) { cout << path[i] << " "; } cout << endl; return; } for(int i = 0; i < n; i++) { if( (cur == 0 || a[i] >= path[cur-1]) && a[i] <= diff ) { path[cur] = a[i]; printAll(a, n, diff-a[i], path, cur+1); } }}int main() { int a[] = {1,2,5,10}; int b = 20; int* path = new int[30]; printAll(a, 4, b, path, 0); cout << count << endl; return 0; }
0 0
- 回溯法应用:1,2,5,10四个数任意次数相加得到一个数N
- 1,2,5,10四个基数任意次数组合相加得到一个数N,求所有可能组合
- 得到一个2^N数
- excel 中任意几个数相加后等于一个数
- 一个数可以由哪些数相加得到
- 使用5,7,12做加减运算,如果用最少步数得到任意数n
- N SUM 数组中任意数相加的结果等于剩下的数相加和
- 一个有序正整数集S,若要保证整数集中所有的数通过组合(相加)可以表示1~N中任意一个正整数
- 输入任意一个数,得到1到这个数之间的1的个数
- 摩尔投票法, O(n) O(1) 求出现次数大于n/2,n/3次数的数
- 回溯法的一个典型应用,在1~x中选出n个数的排列方式,且相邻两个数不一样·
- JAVA函数实现任意给定一组数, 找出任意数相加等于某数或者在一个范围
- 得到两个long型数字之间的任意一个数
- 将该整数每位的数平方后相加,得到一个新的数,如此循环下去,最后能得到1。
- 两数相加求进位次数
- 给定一个N位数,得到一个N-k位的数中最小的数
- 给定一个N位数,得到一个N-k位的数中最小的数
- 得到一个平方数
- Android-PullToRefresh开源项目的使用
- Linux命令-awk
- java AIO示例
- Android应用性能优化
- sql server 独占数据库方法
- 回溯法应用:1,2,5,10四个数任意次数相加得到一个数N
- 新浪微博开发之定义TabBar控件笔记
- 第十二周项目四:点、圆的关系(二)
- spark streaming 错误集锦
- Java基础 二维数组 面向对象(1)
- 第十二周项目四:点,园的关系(三)
- Android音乐播放器中的歌词同步学习分析
- comparator与comparable的区别
- [汇编] 汇编语言实现简易文本编辑器(光标移动、上卷和退格删除)