简单的整数划分问题 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;
}