面试题:随意取数

输入两个整数 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);
}
诸位正值青春年少,一定恣情放纵,贪恋香艳梅施之情,喜欢风流雅韵之事,洒脱木拘。然而诸位可知,草上露一碰即落,竹上霜一触即溶,此种风情难于长久。
原文地址:https://www.cnblogs.com/shilipojianshen/p/12607367.html