C++子集和数问题的递归回溯算法SUMOFSUB

余祥宣, 崔国华, 邹海明. 计算机算法基础.3版[M]. 华中科技大学出版社, 2006.
P204 算法8.6
手动输入一下参数
n=6,M=30
输入的是P205的例子

6 30
5 10 12 13 15 18

#include<iostream>
#include<fstream>
using namespace std;

#define N 100

int W[N];
bool X[N];

int M;
int n;

void SUMOFSUB(int s, int k, int r)
{
    int j;
    X[k] = 1;
    if (s + W[k] == M)
    {
        for (j = 1; j <= k; j++)
        {
            cout << X[j] << " ";
        }
        cout << endl;
    }
    else
    {
        if (s + W[k] + W[k + 1] <= M)
        {
            SUMOFSUB(s + W[k], k + 1, r - W[k]);
        }
    }

    if ((s + r - W[k] >= M) && (s + W[k + 1] <= M))
    {
        X[k] = 0;
        SUMOFSUB(s, k + 1, r - W[k]);
    }

}

int main()
{
    ifstream in("input.txt");
    W[0] = 0;
    cout << "input n: ";
    cin >> n;
    cout << "input M: ";
    cin >> M;
    int r=0,i = 1;
    while (i <= n)
    {
        cout << "input W["<<i<<"]: ";
        cin >> W[i];
        if (W[i - 1] > W[i])
            return 1;

        r += W[i++];
    }
    cout << endl;
    SUMOFSUB(0, 1, r);  
    system("PAUSE");    
    return 0;
}

运行结果
C++子集和数问题的递归回溯算法SUMOFSUB运行结果1
C++子集和数问题的递归回溯算法SUMOFSUB运行结果2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值