006:简单的整数划分问题
题目
描述
将正整数n 表示成一系列正整数之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=nk>=1 ,k>=1 。
正整数n 的这种表示称为正整数n 的划分。正整数n 的不同的划分个数称为正整数n 的划分数。
输入
标准的输入包含若干组测试数据。每组测试数据是一个整数N(0 < N <= 50)。
输出
对于每组测试数据,输出N的划分数。
样例输入
5
样例输出
7
提示
5, 4+1, 3+2, 3+1+1, 2+2+1, 2+1+1+1, 1+1+1+1+1
题目地址
思路:
1. 总结问题。
原:给定一个整数后,找到这个数的全部划分数。
现:给定一个整数,以他本身作为最大值,找出范围内的全部划分数。
2. 总结已知情况。
整数为n,最大值为m
2.1 n的划分数内,1<=m<=n
2.2 对于n的划分数,如6=5+1=3+3...,有 6 的划分数=(6+0)的划分数+(5+1)的划分数+(4+2)的划分数+...(1+5)的划分数。
3. 总结规律并用代码实现。
整数为n的划分数,最大值为n
3.1 递归式的总结
对于一个整数n的划分数,可分为两种情况
1. 包含m的划分数
2. 不包含m的划分数
所以可以得到公式 n 的划分数 = 包含 m 的划分数 + 不包含 m 的划分数
3.2边界条件的确定:
观察总结的情况,可得知
1.当n=m时,划分数=1
2.若n=1或m=1,划分数=1
2.1 最大值为 1,整数再大也只能划分为一类1+1+....+1
2.2 整数为 1,最大值再大也施展不开 详见后面递归式详解。
3.3递归式的分类
1.n>=m, n 的划分数 = 包含 m 的划分数 + 不包含 m 的划分数
2.n<m, 此时情况为,若 n = 2,m = 5,实际上的最大值却是 m = 2,因为更大值永远无法构成 2。
所以可以得到
n 的划分数 = 包含 m(m=n) 的划分数 + 不包含 m 的划分数
3包含 m 的划分数
根据上文可以得知,如5=4+1,包含4的划分数,由1决定,同理3+2也一样,
因此可以得出结论,包含 m 的划分数,即是以 m 作为最大值,求整数(n - m)的全部划分数
代码
点击查看代码
#include<stdio.h>
int y[60][60]={}; //储存数组,用于动态规划
int begin(int n,int m) //两个参数,整数和最大值
{
if (n==1||m==1)
{
return 1;
}
else if (n==m)
{
return 1+begin(n,n-1);
}
int x = n - m;
if (y[n][m]!=0)
{
return y[n][m];
}
else if (m<=x)
{
x=begin(x,m)+begin(n,m-1);
}
else
{
x=begin(x, x) + begin(n, m - 1);
}
y[n][m] = x;
return x;
}
int main()
{
int N;
while (scanf("%d",&N)!=EOF)
{
printf("%d\n", begin(N, N));
}
return 0;
}
END
以此记录第一次写的博客

浙公网安备 33010602011771号