余祥宣, 崔国华, 邹海明. 计算机算法基础.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;
}
运行结果