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

来源:互联网 发布:java dwg 编辑:程序博客网 时间:2024/04/29 13:39

子集和数问题

老师课堂上讲回溯法的第二个例子就是子集和数,昨晚上实现了八皇后,今天想按照同样的思路来写一下子集和数。写了两个来小时,发现如果不用递归没有办法表示回溯(都怪我内力太过薄弱,找不到方法。。)可是我看课件的时候,又觉得递归根本没有办法表达出回溯的思想。但是后来写着写成程序,进行不下去的时候,我耐着性子,一步一步写下了递归调用函数的过程,搞明白了算法是属于回溯求解的原因,在这里特别想要感谢一下我们伟大的递归~~~
代码来啦

#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在调用过程中的变化,有待进一步思考~~
啦啦啦,今天的小代码完成啦~~
每天写一点,写到我不怕写代码,甚至爱上它为止,啦啦啦~~
中午的米线好多,吃的好饱,哈哈哈

0 0
原创粉丝点击