寻找和为定值的多个数
题目描述
输入两个整数n和sum,从数列1,2,3.......n 中随意取几个数,使其和等于sum,要求将其中所有的可能组合列出来。
解法:
类背包问题(递归问题)
可以看出这是关于0-1背包问题,可以将问题定义为f(n,m),从1->n中选择多个数,使得之和为m
那么(1)选取n,则剩下从n-1个数中选择和为m-n的数,即求f(n-1,m-n)
( 2)不选取n,则从剩下的n-1个数中选择和为m的数,即求f(n-1, m)
那么(1)选取n,则剩下从n-1个数中选择和为m-n的数,即求f(n-1,m-n)
( 2)不选取n,则从剩下的n-1个数中选择和为m的数,即求f(n-1, m)
list<int> nums;
void func(int n, int m)
{
if(n<=0 || m<=0)
return;
if(n == m)
{
for(list<int>::iterator iter = nums.begin();iter!=nums.end();iter++)
cout<<*iter<<"+";
cout<<n<<endl;
}
nums.push_front(n);
func(n-1, m-n);
nums.pop_front();
func(n-1,m);
}