编程求解,输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来。
求解思路:
1.首先判断,如果n>m,则n中大于m的数不可能参与组合,此时置n = m;
2.递归求解
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void dfs(int &n,vector<vector<int>> &res,vector<int> &tmp,int m,int index)
{
if(m==0)
res.push_back(tmp);
else if(m>0)
{
for(int i=index;i<=n;i++)
{
tmp.push_back(i);
dfs(n,res,tmp,m-i,i+1);
tmp.pop_back();
}
}
}
vector<vector<int>> find(int n,int m)
{
vector<vector<int>> res;
vector<int> tmp;
if(n>=m)
n=m;
dfs(n,res,tmp,m,1);
return res;
}
int main()
{
int n,m;
while(cin>>n>>m)
{
vector<vector<int>> res=find(n,m);
for(int i=0;i<res.size();i++)
{
for(int j=0;j<res[i].size();j++)
cout<<res[i][j]<<" ";
cout<<endl;
}
}
return 0;
}