zoukankan      html  css  js  c++  java
  • IT公司100题-21-输入n和m,和等于m

    问题描述:
    输入两个整数n 和m,从数列1,2,3,…,n 中随意取几个数, 使其和等于m,将所有可能的组合都打印出来。
     
    分析:
    利用递归的思路,对于1,2,3,…,n 中的任意一个数,要么选,要么不选。递归下去,直到其和等于m时,输出。
     

    解答:

     1 // 21.cc
     2 #include <iostream>
     3 #include <cstring>
     4 using namespace std;
     5 
     6 void print(int* aux, int n) {
     7     for (int i = 0; i < n; i++)
     8         if (aux[i])
     9             cout << i << " ";
    10     cout << endl;
    11 }
    12 
    13 void helper(int m, int cur, int* aux, int n) {
    14     if (m == 0)
    15         print(aux, n);
    16     if (m <= 0 || cur == n)
    17         return;
    18 
    19     // 不选cur
    20     helper(m, cur + 1, aux, n);
    21 
    22     // 选cur
    23     aux[cur] = 1;
    24     helper(m - cur, cur + 1, aux, n);
    25     aux[cur] = 0;  // 回溯
    26 }
    27 
    28 void find_combi(int n, int m) {
    29     if (n > m) 
    30         find_combi(m, m);
    31 
    32     int* aux = new int[n];  // aux[i] = 1,表示选择i
    33     memset(aux, 0, n * sizeof(int));
    34     helper(m, 0, aux, n);
    35 }
    36 
    37 int main() {
    38     int n, m;
    39     cout << "input n and m:" << endl;
    40     cin >> n >> m;
    41     find_combi(n, m);
    42     return 0;
    43 }
    $ ./a.exe
    input n and m:
    6 3
    1 2
    0 1 2
    3
    1 2
    0 3
    0 1 2
  • 相关阅读:
    Qt5.3.2(VS2010)_调试_进入Qt源码
    Qt5.3.2(VS2010)_调试_遇到的问题
    Qt_QString::split测试
    Qt_QString.indesOf和mid测试
    激活_目标窗口
    DrawDibDraw__ZC测试
    【转】DrawDibDraw
    数学运算_基本_01
    get和post请求及进程和线程及cookie和session的区别
    Redis性能优化之redis.cnf配置文件
  • 原文地址:https://www.cnblogs.com/dracohan/p/3919901.html
Copyright © 2011-2022 走看看