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

    题目:

    将正整数划分成一系列正整数的和:

    N = n1 + n2 + n3 +n4 + ...+nk ( n1>=n2>=n3...>=nk>=1,k=1)。

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

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

    给定n,求p(n)。

    分析:

    对给定的n的不同划分,n1一定是小于等于n。因此可以确定 n1的范围为1≤  n1 ≤ n。

    为方便讨论n1取某个取值时的划分数,定义n1不大于m时n的划分数为p(n,m)。


    当m=1时,

    n只能被分成n个1,故p(n,1)=1

    当m < n时,n的划分有两类:

    n1 = m的划分,此时划分数等于n-m的划分,即p(n-m,m)

    n1 < m 的划分,即划分的数字中都比m小,因此应该是n1 <= m-1,此时划分数为p(n,m-1)

    故p(n,m)=p(n,m-1)+p(n-m,m)

    当m = n时,可以分为两类

    n1 = n ,只有1种

    n1 < n,即n1 <= n-1 ,种数为p(n,n-1)

    代码:

    #include<stdio.h>
    int p(int n,int m) {
    	if(m== 1)
    		return 1;
    	if(m< n)
    		return p(n,m-1)+p(n-m,m);
    	if(m== n)
    		return 1 + p(n,n-1);
    	if(m> n)
    		return p(n,n);
    }
    int main() {
    	int n;
    	scanf("%d",&n);
    	printf("%d
    ",p(n,n));
    	return 0;
    }


  • 相关阅读:
    洛谷P4979 矿洞:坍塌
    [SHOI2015]脑洞治疗仪
    洛谷P2135 方块消除
    洛谷P1436 棋盘分割
    洛谷P2796 Facer的程序
    浅谈位运算
    [SDOI2006]最短距离
    12耐心_预测未来
    11耐心_有效市场假说
    02C++条件变量
  • 原文地址:https://www.cnblogs.com/infoflow/p/7535863.html
Copyright © 2011-2022 走看看