回溯法应用:1,2,5,10四个数任意次数相加得到一个数N
2015-05-27 12:36
447 查看
#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; }
相关文章推荐
- 四个基数任意次数组合相加得到一个数N,求所有可能组合
- 1,2,5,10四个基数任意次数组合相加得到一个数N,求所有可能组合
- 比如你给它任意一个正整数,它可以按照一定的运算规则, 计算出得到1的最少操作次数。
- 如何得到任意一个存储过程的参数列表的
- 小易邀请你玩一个数字游戏,小易给你一系列的整数。你们俩使用这些整数玩游戏。每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字。 例如: 如果{2,1,2,7}是你有的一系列数,小易说的数字是11.你可以得到方案2+2+7 = 11.如果顽皮的小易想坑你,他说的数字是6,那么你没有办法拼凑出和为6 现在小易给你n个数,让你找出无法从n个数中选取部分求和
- (串的模式匹配4.6.2)POJ 3461 Oulipo(KMP算法的应用——求一个单词在一行文本中的出现次数)
- 对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)某一个元素也加一,现给出一正数矩阵,判断其是否能够由一个全零矩阵经过上述运算得到
- 将该整数每位的数平方后相加,得到一个新的数,如此循环下去,最后能得到1。
- 如何得到任意一个存储过程的参数列表的
- Python3基础 str count 得到一个字符串出现的次数
- pojg2744找一个最长的字符串x,使得对于已经给出的字符串中的任意一个y,x或者是y的子串,或者x中的字符反序之后得到的新字符串是y的子串。
- 一个有序正整数集S,若要保证整数集中所有的数通过组合(相加)可以表示1~N中任意一个正整数
- 编写一个程序,对用户输入的任意一组数字字符如{3,1,4,7,2,1,1,2,2},输出其中出现次数最多的字符,并显示其出现次数。如果有多个字符出现次数均为最大且相等,则输出最先出现的那个字符和它出现
- 本来从动态壁纸预览页面设置一个动态壁纸回到桌面便可以看到桌面动态壁纸,可以观察得到自己的动态壁纸是否设置成功了(必须知道设置是否成功的结构,因为还有一些操作需要完成)! 但是现在是要在自己的应用中进入
- 输入一个手机号得到归属地——httpClient应用
- 给定一个任意的10进制数N,从1开始到N,计算所有数中1出现的次数
- 九宫格扩展,输入一个奇数,得到横竖斜相加相等结果
- 字符串的几种应用,去除两端空格,将字符串反串,取出一个字符串在另一个字符串的次数,获取一个字符串在另一个字符串中最大子串
- 求一个序列,其中任意n个数字相加不会等于该序列里的其他值,任意一个数字的倍数不等于该序列里的其他值
- 给定一个整数,求解该整数最少能用多少个Fib数字相加得到