zoukankan      html  css  js  c++  java
  • 整数拆分问题_C++

    一、问题背景

       整数拆分,指把一个整数分解成若干个整数的和

      如 3=2+1=1+1+1  共2种拆分

      我们认为2+1与1+2为同一种拆分

    二、定义

      在整数n的拆分中,最大的拆分数为m,我们记它的方案数为 f(n,m)

      即 n=x1+x2+······+xk-1+xk ,任意 x≤m

      在此我们采用递归递推法

    三、递推关系

      1、n=1或m=1时

           拆分方案仅为 n=1 或 n=1+1+1+······

         f(n,m)=1

      2、n=m时

         S1选取m时,f(n,m)=1,即n=m

         S2不选取m时,f(n,m)=f(n,m-1)=f(n,n-1),此时讨论最大拆分数为m-1时的情况

         可归纳 f(n,m)=f(n,n-1)+1

      3、n<m时

         因为不能选取m,所以可将m看作n,进行n=m时的方案,f(n,m)=f(n,n)

      4、n>m时

         S1选取m时,f(n,m)=f(n-m,m),被拆分数因选取了m则变为n-m,且n-m中可能还能选取最大为m的数

         S2不选取m时,f(n,m)=f(n,m-1),此时讨论最大拆分数为m-1时的情况

         可归纳 f(n,m)=f(n,m-1)+f(n-m,m)

    总递推式为

     

    代码如下

     1 #include <algorithm>
     2 #include <iostream>
     3 #include <cstdlib>
     4 #include <cstring>
     5 #include <cstdio>
     6 #include <cmath>
     7 using namespace std;
     8 
     9 int f(int n,int m)
    10 {
    11     if ((n!=1)&&(m!=1))
    12         {
    13             if (n>m) return f(n-m,m)+f(n,m-1);
    14             else return 1+f(n,n-1);
    15         }
    16     else return 1;
    17 }
    18 void work()
    19 {
    20     int n,m;
    21     cin>>n>>m;
    22     cout<<f(n,m);
    23 }
    24 int main()
    25 {
    26     freopen("cut.in","r",stdin);
    27     freopen("cut.out","w",stdout);
    28     work();
    29     return 0;
    30 }

     此外还有母函数法,具体参考

    http://blog.chinaunix.net/uid-26548237-id-3503956.html

    版权所有,转载请联系作者,违者必究

    QQ:740929894

  • 相关阅读:
    ZOJ3513_Human or Pig
    ZOJ2083_Win the Game
    ZOJ2725_Digital Deletions
    ZOJ2686_Cycle Gameu
    UVALive
    ZOJ2290_Game
    ZOJ3067_Nim
    P3159 [CQOI2012]交换棋子(费用流)
    P3153 [CQOI2009]跳舞(最大流多重匹配)
    P3121 [USACO15FEB]审查(黄金)Censoring (Gold)(ac自动机)
  • 原文地址:https://www.cnblogs.com/hadilo/p/5733305.html
Copyright © 2011-2022 走看看