• 自然数划分


    试题描述

    输入任意一个大于1的自然数总可以表示为若干个小于n的正整数之和,求拆分的方案数。

    (1+2与2+1为一种方法)

    输入
    第一行为一个正整数n。
    输出
    输出可以拆分的方案数。
    输入示例
    7
    输出示例
    14
    其他说明
    2<=n<=100.
     

    思路:递!推!
    y=f(k,n); //把n拆成y份,其中最大的是k
    y`=g(k,n); //把n分成y`份,其中最大的数小于等于k

    g(k,n)=f(1,n)+f(2,n)+f(3,n)+...+f(k,n) //第二行函数定义的数学表达式
    g(k-1,n)=f(1,n)+f(2,n)+f(3,n)+...+f(k-1,n)
    由此得出:
    g(k,n)=g(k-1,n)+f(k,n)

    f(k,n)=g(k,n-k) //减掉一个最大的(参照上面数学表达式)
    g(k,n)=g(k-1,n)+g(k,n-k); //***递推公式***
    ↓【分类讨论】
    k=1时, g(1,n)=1
    k>n时, 无意义
    k<n时, g(k,n)=g(k-1,n)+f(k,n);

     1 #include <iostream>
     2 
     3 using namespace std;
     4 int ans,x;
     5 int ways(int n,int k)
     6 {
     7     if(n<k) return 0;
     8     if(n==k || k==1) return 1;
     9     return ways(n-k,k)+ways(n-1,k-1);
    10 }
    11 int main()
    12 {
    13     scanf("%d",&x);
    14     for(int i=2;i<=x;i++) ans+=ways(x,i);
    15     printf("%d",ans);
    16     //system("pause");
    17     return 0;
    18 }
    自然数划分
  • 相关阅读:
    hdu 1225大水题
    hdu2102广搜
    hdu1403 赤裸裸的后缀数组
    hdu 1526 poj 1087最大流
    hdu 1557暴力枚举
    hdu 1240广搜
    hdu4416 后缀数组
    hdu1113大水题
    hdu2222赤裸裸的DFA
    hdu4476水题
  • 原文地址:https://www.cnblogs.com/YXY-1211/p/5681222.html
Copyright © 2020-2023  润新知