• 整数划分问题


     

     

    整数划分问题

     

     

    问题描述:

    将正整数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;
    }
    

      

    运行截图:

      

  • 相关阅读:
    【leetcode】525. Contiguous Array
    【leetcode】827. Making A Large Island
    【leetcode】540. Single Element in a Sorted Array
    【leetcode】45. Jump Game II
    2017.11.2 Talk to customers for an hour
    New Concept English three (29)
    New Concept English three (28)
    2017.10.31 Enginer+position+statement
    New Concept English three (27)
    2017.10.30 Epicor -ERP
  • 原文地址:https://www.cnblogs.com/canneddream/p/14212436.html
Copyright © 2020-2023  润新知