简单的整数划分问题 OpenJ_Bailian - 4117 【递推+思维】

https://vjudge.net/problem/OpenJ_Bailian-4117

非常非常经典的问题. 一直以来总是沉浸于用算法的思维去解决问题, 碰到一个题, 就先想想能不能套版子能不能用Dfs..Dp.

这道题看起来不难, 自己尝试写了一下, 结果是WA了. 可以说是一道比较纯粹的数学问题, 而且不算太难, 稍有基础的高中生应该都能列出来函数式的数学问题.

切记: 算法, 首先就是数学. 

这道题中大量用到了数学中极其常用的分类讨论思想.

划出箭头的地方大家仔细理解一下.

题中要求我们求的即是f(n, n)

//简单的整数划分问题
#include<cstdio>
using namespace std;
int num;
int f(int n, int m)
{
    if(n==1 || m==1) return (1);
    else if(n==m) return (f(n, n-1)+1);
    else if(n < m) return (f(n, n));
    else if(n > m) return (f(n-m, m)+f(n, m-1));
}

int main()
{
    while(scanf("%d",&num) != EOF){
        printf("%d\n",f(num, num));
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/a1097304791/article/details/82915853