您的位置:首页 > 其它

算法学习:子集和数问题求解

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在调用过程中的变化,有待进一步思考~~

啦啦啦,今天的小代码完成啦~~

每天写一点,写到我不怕写代码,甚至爱上它为止,啦啦啦~~

中午的米线好多,吃的好饱,哈哈哈
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: