nyoj 90 整数划分【dp划分数】

整数划分

时间限制: 3000 ms  |  内存限制: 65535 KB
难度: 3
描述
将正整数n表示成一系列正整数之和:n=n1+n2+…+nk, 
其中n1≥n2≥…≥nk≥1,k≥1。 
正整数n的这种表示称为正整数n的划分。求正整数n的不 
同划分个数。 
例如正整数6有如下11种不同的划分: 
6; 
5+1; 
4+2,4+1+1; 
3+3,3+2+1,3+1+1+1; 
2+2+2,2+2+1+1,2+1+1+1+1; 
1+1+1+1+1+1。 

输入
第一行是测试数据的数目M(1<=M<=10)。以下每行均包含一个整数n(1<=n<=10)。
输出
输出每组测试数据有多少种分法。
样例输入
1
6
样例输出
11


n 的m 划分数的求法:

1,如果分成的m 组 每个元素都不为零,那么相当于求 n-m 的m划分

2,如果有一个组的数字为0,那么就是求n的m-1划分

 两种情况无交叉,步步递推能得到最终结果。


挑战程序设计上只表述了,用二维数组来计算n 的m 划分的方法。看的有点不太明白


/*
http://blog.csdn.net/liuke19950717
*/
#include
#include
int slove(int n)
{
	int dp[105][105]={1};
	for(int i=1;i<=n;++i)
	{
		
		for(int j=0;j<=n;++j)
		{
			if(j>=i)
			{
				dp[i][j]=dp[i-1][j]+dp[i][j-i];
			}
			else
			{
				dp[i][j]=dp[i-1][j];
			}
		}
	}
	return dp[n][n];
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int n;
		scanf("%d",&n);
		printf("%d\n",slove(n));
	}
	return 0;
} 


一维数组的代码


/*
http://blog.csdn.net/liuke19950717
*/
#include
#include
int slove(int n)
{
	int dp[105]={1};
	for(int i=1;i<=n;++i)
	{
		for(int j=i;j<=n;++j)
		{
			dp[j]+=dp[j-i];
		}
	}
	return dp[n];
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int n;
		scanf("%d",&n);
		printf("%d\n",slove(n));
	}
	return 0;
}



你可能感兴趣的:(简单DP&&背包问题,ny,oj)