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

以此记录第一次写的博客

posted @ 2022-12-27 13:38  淦丘比  阅读(97)  评论(0)    收藏  举报