输出1到N之间所有相加等于M的数字组合求相加为M的所有组合
解法:由该题可知是典型的背包问题。采用0-1背包的思想,使用递归方法:
当选择n时,就用剩下的n-1填满 m-n;
当不选择n是,就用剩下的n-1填满m;
注意的是,当m=n时,即找到了符合条件的解。
#include<iostream>
#include<list>
using namespace std;
list<int> list1;
int total = 0;
void find(int sum, int n)
{
//递归出口
if (sum <= 0 || n <= 0)
return;
//输出找到的结果
if (sum == n) //表示找到了一个值
{
list1.reverse(); //使输出顺序更规范
for (list<int>::iterator i = list1.begin(); i != list1.end(); i++)
cout << *i << " ";
cout << n << endl;
total++;
list1.reverse();
}
list1.push_front(n);
find(sum - n, n - 1); //如果放入n,则从剩余n-1个数中填满sum-n
list1.pop_front();
find(sum, n - 1); //如果不放入n,从n-1个数中填满sum
}
int main()
{
int n,m;
cout << "Please Input n:" << endl;
cin >> n;
cout << "Please Input m:" << endl;
cin >> m;
find(m, n);
cout << total;
return 0;
}