问题描述:设集合S={x1,x2,…,xn}是一个正整数集合,c是一个正整数,子集和问题判定是否存在S的一个子集S1,使S1中的元素之和为c。试设计一个解子集和问题的回溯法。将子集和问题的解输出。当问题无解时,输出“No Solution!”。
因为我在代码里的注释已经写了很多了,大家将就看着注释理解哈
直接贴代码:
#include<iostream>
using namespace std;
#define N 10000
int n, c, rest = 0;//rest表示从当前元素加到最后一个元素的总和,用来回溯时判断限界剪枝
int a[N];//a[N]存储S集合元素 ,最多可以存储N个
int x[N] = {0};//设置x[N]来表示a[N]元素是否选择,初始为0,若为1则表示选择
int sum = 0;//当前所选元素之和
bool backtrack(int t)//调用这个方法判断是否有解
{
if( sum == c )
return true; // 找到可行解
if( t > n )
ret