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

     

     

    整数划分问题

     

     

    问题描述:

    将正整数n表示成一系列正整数之和,

    n=n1+n2+n3+n4+...+nk,

    其中n1>=n2>=n3>=n4>=...>=nk>=1,k>=1,

    正整数n的这种表示称为正整数n的划分。

    正整数n的不同划分个数称为正整数n的划分数,记作 p(n)。

    例如,正整数6有如下11种不同的划分,所以 p(6)=11

    6;
    
    5+1;
    
    4+2,4+1+1;
    
    3+3,3+2+1,3+1+1+1;
    
    2+2+2,2+2+1+1,2+1+1+1+1;
    
    1+1+1+1+1+1;
    

      

    解题思路:

    在正整数n的所有不同划分中,将最大加数n1不大于m的划分个数记作 q(n,m)

    n就是要划分的整数,m就是划分过程中出现的最大加数

    (1)当 n=1时,q(1,m)=1

    此时要划分的整数为1,实际上m的值是小于等于n的,所以此时q(1,m)=q(1,1)=1

    (2)当 m=1时,q(n,1)=1

    此时划分过程中的最大加数为1,即 n 个 1 相加

    (3)当 n<=m 时,q(n,m)=q(n,n)

    此时也是划分过程中,实际上m是小于等于n的

    (4)当 n=m时,q(n,m)=q(n,n)=1+q(n,n-1)

    (5)当 n>m>1时,q(n,m)=q(n,m-1)+q(n-m,m)

    可以根据以上的关系给出计算q(n,m)的递归公式:

    测试代码:

    #include<iostream>
    using namespace std; 
    
    int q(int n,int m)
    {
    	if(n == 1 || m == 1) return 1;
    	else if(n < m) return q(n,n);
    	else if(n == m) return q(n,n-1) + 1;
    	else return q(n,m-1)+q(n-m,m);
    }
    
    int main()
    {
    	int n;
    	cin>>n;
    	int sum=q(n,n);
    	cout<<sum<<endl;
    	return 0;
    }
    

      

    运行截图:

      

  • 相关阅读:
    linux下的防火墙iptables
    oracle 学习
    关于测试计划制定
    Android APP性能测试笔记(一)
    adb报错问题解决方法
    Android studio安装与配置
    领导能力与领导力
    ADB安装及使用
    Advanced-REST-client
    性能测试体系-测试分析及调优
  • 原文地址:https://www.cnblogs.com/canneddream/p/14212436.html
Copyright © 2011-2022 走看看