面试题:随意取数

输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数,
使其和等于 m ,要求将其中所有的可能组合列出来.

这道题,分两种情况:取当前数和不取。

若取,则:

m = m-n;

若不取,则:

n = n-1; m = m;

另外注意条件:

m == 0 ;//输出结果
n <= 0 || m < 0;//返回,因为没有符合结果的值

整体代码为:

#include<bits/stdc++.h>
using namespace std;
void solve(vector<int> res, int n , int m)
{
    if(m == 0) //输出
    {
        for(auto r1 : res)
        cout<<r1<<" ";
        cout<<endl;
        return;
    }
    if(n <= 0 || m < 0)//不符合,返回
        return ;
    vector<int> r = res;
    solve(res,n-1,m); //递归不选
    r.push_back(n);
    solve(r,n-1,m-n);//递归选
}
int main()
{
    vector<int> res;
    int n,m;
    cin>>n>>m;
    n = n>m?m:n;//n大于m肯定没有符合条件的组合.
    solve(res,n,m);
}

 

posted @ 2020-03-31 18:15  十里坡剑神—》》》》  阅读(134)  评论(0编辑  收藏  举报