完整程序:
#include<bits/stdc++.h>
using namespace std;
//子集和问题回溯算法
//(1) 子集和问题回溯算法的数据结构
#define NUM 10000
int n; //集合S中的元素的个数
int c; //子集和的目标值
int cw; //当前的子集和
int bestw; //当前的最优值
int w[NUM]; //存放集合S中的元素
int x[NUM]; //构成当前子集和的元素
int r; //集合S中剩余的所有元素的和
bool flag; //获得最优值的标志
//(2) 子集和问题回溯算法的实现
//形参表示搜索第t层结点
void backtrack(int t)
{
if(t>n) //到达叶子结点
{
//获得最优解
if(cw==c)
{
for(int i=1; i<=n; i++)
if (x[i]) printf("%d ",w[i]);
printf("\n");
flag = false; //已经有最优值
}
return;
}
//更新剩余的所有元素的和
r -= w[t];
if (cw+w[t]<=c) //搜索左子树
{
x[t] = 1;
cw += w[t];
backtrack(t+1);
cw -= w[t];
}
if (cw+r>bestw) //搜索右子树
{
x[t] = 0;
backtrack(t+1);
}
r += w[t]; //恢复状态
}
int main(){
//(3)剩余的所有元素的和r初始化
r = 0;
for(int i=1; i<=n; i++)
{
scanf("%d", &w[i]);
r += w[i];
}
}