完整程序:
#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];
}
}