算法学习:子集和数问题求解
2015-12-19 13:35
281 查看
子集和数问题
老师课堂上讲回溯法的第二个例子就是子集和数,昨晚上实现了八皇后,今天想按照同样的思路来写一下子集和数。写了两个来小时,发现如果不用递归没有办法表示回溯(都怪我内力太过薄弱,找不到方法。。)可是我看课件的时候,又觉得递归根本没有办法表达出回溯的思想。但是后来写着写成程序,进行不下去的时候,我耐着性子,一步一步写下了递归调用函数的过程,搞明白了算法是属于回溯求解的原因,在这里特别想要感谢一下我们伟大的递归~~~代码来啦
#include<iostream> using namespace std; const int m = 30; void printresult(int *w, int *x,int n) { for(int i = 1; i <= n; i++) { if(x[i]) { cout << w[i] << " "; } } cout << endl; } void SumOfSub(int s, int k, int r, int *w, int *x) { x[k] = 1; if((w[k] + s) == m) { //打印结果 printresult(w, x, k); }else{ if((s + w[k] + w[k+1]) <= m) { SumOfSub(s+w[k], k+1, r-w[k], w, x); } } if((s + r - w[k]) >= m && (s + w[k+1]) <= m) { x[k] = 0; SumOfSub(s, k+1, r-w[k], w, x); } } int main() { int w[7] = {0, 5, 10, 12, 13, 15, 18}; int x[7] = {0, 0, 0, 0, 0, 0, 0}; SumOfSub(0, 1, 73, w, x); return 0; }
这段代码里面还有一点我没有想明白,就是数组x在调用过程中的变化,有待进一步思考~~
啦啦啦,今天的小代码完成啦~~
每天写一点,写到我不怕写代码,甚至爱上它为止,啦啦啦~~
中午的米线好多,吃的好饱,哈哈哈
相关文章推荐
- composer更换为国内镜像源
- 通过os中的os.path.basename获取路径中的文件名
- LeetCode Merge Two Sorted Lists(合并两个有序链表)
- 黑马程序员-OC语言-封装
- 数据结构期末总结(对翻转课堂的感受)
- 为什eclipse中调试的时候总是不弹出调试界面而是安装运行
- PHP中实现定时任务
- java线程池框架源代码分析
- [推荐]一个 1kb 的image placeholder的js库
- 一种呼叫中心排队路由的方法及装置
- Leetcode: Summary Ranges
- GitHub上传代码教程
- LeetCode Merge Sorted Array(合并有序数组)
- 实战c++中的vector系列--emplace_back造成的引用失效
- 实战c++中的vector系列--emplace_back造成的引用失效
- matlab取整函数
- 设计模式之原型模式
- 有沃更精彩,沃课堂理想的移动学习平台
- Android高效率编码-第三方SDK详解系列(一)——百度地图,绘制,覆盖物,导航,定位,细腻分解!
- 使用.Net开源项目NPOI操作Excel、Word、ppt