zoukankan      html  css  js  c++  java
  • 整数的划分问题

    详见(http://www.darkswordzone.com/?p=749

    对于一个正整数n的划分,就是把n表示成一系列正整数的和,划分与次序无关。
    如一个正整数5,可以划分为:
    [5]
    [4,1]
    [3,2] [3,1,1]
    [2,2,1] [2,1,1,1]
    [1,1,1,1,1]
    将一个正整数n划分,共有多少种划分方式?
    上面的例子第一行,所有加数不超过5;
    第二行,所有加数不超过4;
    。。。。。。。
    第五行,所有加数不超过1.
    定义int fun(int n,int m)表示正整数n,所有加数不超过m的划分数目。
    那么
    1,n==1或m==1 时共有1种划分方式。
    2,n==m时 fun(n,m)=fun(n,m-1)+1 。
    3,n>m时, 我们发现只要将fun(n,m-1)加上包含加数m的划分数就等于div(n,m)。即:fun(n,m) = fun(n,m-1) + 包含加数m的划分数。
    包含加数m的划分数可以转化为:fun(n-m,m)。所以3可以表示为:
    fun(n,m) = fun(n,m-1) + fun(n-m,m)
    4、n < m 等同于2.
    代码如下:

    View Code
     1 //求正整数n的划分数
     2 #include<iostream>
     3 using namespace std;
     4 int fun(int n,int m){
     5     if(n==1 || m==1)
     6          return 1;
     7     else if(n==m)
     8          return fun(n,m-1)+1;
     9     else if(m>n)
    10          return fun(n,n);
    11     else
    12          return fun(n,m-1)+fun(n-m,m);
    13 }
    14 int main(){
    15     int n;
    16     while(cin>>n){
    17          cout<<fun(n,n)<<endl;
    18     }
    19 return 0;
    20 }

     

    keep moving...
  • 相关阅读:
    矩阵距离
    CF409D Big Data
    AT2685 i18n
    P3366 【模板】最小生成树
    P3367 【模板】并查集
    ISBN(洛谷P1055)
    关于数组
    0021---一元一次方程
    0020---求圆锥体积
    0019---求圆台的体积
  • 原文地址:https://www.cnblogs.com/xxx0624/p/2602037.html
Copyright © 2011-2022 走看看