/*
问题描述: 从一个序列里面取N个数,使N个数的和为M ,找出这样的序列
*/
#include <iostream>
using namespace std;
int cnt = 2;
int target = 9;
int count = 0;
int tmp = target;
void getSubset(int list[],bool v[],int a,int b,int sum){//list是元素列表,v指示每个元素是否被选中到集合中,a,b 是当前处理的元素初始下标和末尾下标
if(count == cnt && sum == 0) {
for(int i = 0; i < b; i++){
if(v[i]) cout<<" "<<list[i];
}
cout<<endl;
return;
}
if(count >= cnt || sum < 0 || a == b) return;
v[a] = true;
count++;
sum -= list[a];
getSubset(list,v,a+1,b,sum);
v[a] = false;
count--;
sum += list[a];
getSubset(list,v,a+1,b,sum);
}
int main(){
int li[] = {1,2,3,4,5,6};
bool v[] = {false,false,false,false};
getSubset(li,v,0,6,tmp);
}
程序对组合问题的算法进行改编,增加了子集合元素计数cnt和M减去子集合元素和的变量sum
当cnt等于N 且 sum为零的时候,则找到满足要求的 N 个元素
当cnt大于N或者sum小于零 则寻找失败,退出
a == b 表示子集寻找到一条分支的终点,退出