背包问题。
问题:
输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来.
分析:
由该题可知是典型的背包问题,根据该数是否加入进行递归运算。
解法:采用0-1背包的思想,使用递归方法:
当选择n时,就用剩下的n-1填满 m-n;
当不选择n是,就用剩下的n-1填满m;
注意的是,当m=n时,即找到了符合条件的解。
#include<iostream>
#include<vector>
using namespace std;
void print_num(int n, int m, vector<int>& num)
{
//递归出口
if (m<= 0 || n <= 0)return;
//找到合适的解法
if (m == n)
{
for (int i = 0; i < num.size(); i++)
{
cout << num[i] << "\t";
}
cout << n;
cout << endl;
return;
}
num.push_back(n);
print_num(n-1, m - n, num);
num.pop_back();
print_num(n-1,m,num);
}
int main()
{
vector<int> data;
print_num(6, 8, data);
system("pause");
return 0;
}