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

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

6 30
5 10 12 13 15 18

#include
#include
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["<"]: ";
        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张图片

你可能感兴趣的:(算法)