编程求解,输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来(背包问题求解)

来源:互联网 发布:unity3d 碰撞检测 编辑:程序博客网 时间:2024/05/19 02:23

思路来自:http://blog.csdn.net/randyjiawenjie/article/details/6335208

也是同样采用背包问题的思路:对于一个数字,加入背包或不加入背包。

看代码:

/* * 微软100,21题,和为M * start初始为1,end初始为n * currentSum为当前vec中元素的和 * sum为输入的M值 */void findSumM(int sum, int currentSum, int start, int end, vector<int>& vec){if(start > end)return;if(currentSum == sum){//打印for(unsigned i=0; i<vec.size(); i++){cout<<vec[i]<<"*";}cout<<endl;return;}if(currentSum + start > sum){return;}//使用start这个数字vec.push_back(start);findSumM(sum, currentSum+start, start+1, end, vec);//不使用start这个数字vec.pop_back();findSumM(sum, currentSum, start+1, end, vec);}
测试代码:

int main() {vector<int> sumVec;findSumM(10, 0, 1, 7, sumVec);printf("****************\n");
输出结果:

1*2*3*4*
1*3*6*
1*4*5*
2*3*5*
4*6*
****************

0 0
原创粉丝点击