余祥宣, 崔国华, 邹海明. 计算机算法基础.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;
}
运行结果
本文介绍了一个解决背包问题的递归算法实现。通过输入物品数量(n)、背包容量(M)及各个物品的价值,该算法能够找出使得背包总价值最大的物品组合方案。文章提供了完整的C++代码示例,并展示了如何通过递归函数进行子集求和。
764

被折叠的 条评论
为什么被折叠?



