问题:
输入两个整数 n 和 m,从数列1,2,3…….n 中 随意取几个数,使其和等于 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 sum, n;
cout<<"Please Input n&sum:"<<endl;
cin>>n>>sum;
find(sum, n);
cout<<"Total:"<<total<<endl;
return 0;
}
#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;
}