从序列里条N个数,使其和等于M

来源:互联网 发布:天猫第三方数据统计 编辑:程序博客网 时间:2024/05/08 19:08
/*问题描述: 从一个序列里面取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 表示子集寻找到一条分支的终点,退出


阅读全文
0 0
原创粉丝点击