设集合S={x1,x2,…,xn}是一个正整数集合,c是一个正整数,子集和问题判定是否存在S的一个子集S1,使S1中的元素之和为c。试设计一个解子集和问题的回溯法。
设计思想:利用回溯法,树的每一个节点包括1当前和2层数3剩余所有值之和。关键在于剪枝,若加上下一层的数的和小于所要求的和,则进入左子树,否则一定不可能,左子树便不生成。若减掉当前层数的再加上剩余所有数后的值依然小于所要求的和,那么右子树不生成,否则生成右子树,最后当某一层和等于所要求的和时成立并输出(中间用x[]数组来记录是否选中此数,0为未选中,1为选中)。
1.递归方法:可得到所有可能解
#include <bits/stdc++.h>
using namespace std;
int C=0;
int num=0;
int x[10000]={0};
int W[10000]; //0号元素不用
void Backtrack(int sum,int k,int r) //sum为当前的和,k为层数(第几个数),r为剩余数的和
{
if (sum+W[k]==C)//找到了满足子集和要求的一种情况
{
num++;
cout<<"("<<num<<"):";//(1)(2)序号
cout<<"C=";
for (int i=1;i<=k;i++)
{
if(x[i]