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

子集和数问题

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

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

你可能感兴趣的:(算法入门学习)