zoukankan      html  css  js  c++  java
  • 从1到n中找到任意num个数的和为sum的所有组合

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

    比如n = 5, sum  = 8, 那么所有的组合为:

    3  5 或者 1  5  2 或者 1  4  3

    思路:

    对于一个给定的总和sum, 如果我们从数列的尾部开始,即从n开始,sum 要么等于 n 加上 剩余的1到 n - 1之间的某一个组合,或者 等于 1 到 n-1 之间的某一个组合。

    递归的方程为:

    findSum(sum, n) = n + findSum(sum - n, n -1) 或者 findSum (sum, n) = findSum (sum, n -1)

    ----------------------------------------------------------------------

     1 #include <iostream> 
     2 #include <string> 
     3 #include <list>
     4 using namespace std; 
     5 
     6 //fun(n,sum)=n+fun(n-1,sum-n); fun(n,sum)=fun(n-1,sum);
     7 
     8 list<int> li;
     9 void findsum(int n,int sum){
    10 
    11     if(n <0 || sum<0)   return;
    12     if(sum ==0)
    13     {
    14         if(li.size() == 3)
    15         {
    16             li.reverse();
    17             for(list<int>::iterator ix =li.begin();ix!=li.end();ix++)
    18                 cout << *ix <<"\t";
    19             cout << endl;
    20         }    
    21         return;
    22     }    
    23     li.push_back(n);
    24     findsum(n-1,sum-n);
    25     li.pop_back();
    26     findsum(n-1,sum);
    27 
    28 }
    29 
    30 void main() 
    31 { 
    32     int n=9;
    33     int sum=15;
    34     findsum(n,sum); 
    35 } 
  • 相关阅读:
    iptables详解
    Python中的Subprocess模块
    Logging模块
    python inspect.stack() 的简单使用
    python之inspect模块
    python之platform模块
    GlusterFS分布式存储学习笔记
    AD 域服务简介(一)- 基于 LDAP 的 AD 域服务器搭建及其使用
    LDAP概念和原理介绍
    文件传输协议FTP、SFTP和SCP
  • 原文地址:https://www.cnblogs.com/xuxu8511/p/2670159.html
Copyright © 2011-2022 走看看