1. 程式人生 > >計蒜客:程式設計:劃分整數

計蒜客:程式設計:劃分整數

https://nanti.jisuanke.com/t/25082

蒜頭君特別喜歡數學。今天,蒜頭君突發奇想:如果想要把一個正整數 nnn 分解成不多於 kkk 個正整數相加的形式,那麼一共有多少種分解的方式呢?

蒜頭君覺得這個問題實在是太難了,於是他想讓你幫幫忙。

輸入格式

共一行,包含兩個整數 n(1≤n≤300)n(1 \leq n \leq 300)n(1≤n≤300) 和 k(1≤k≤300)k(1 \leq k \leq 300)k(1≤k≤300),含義如題意所示。

輸出格式

一個數字,代表所求的方案數。

樣例輸入

5 3

樣例輸出

5

dp[i][j]表示把 i 分成 j 個數。

可以當成把n分成k個可以為0的數。

當i<j的時候,不能分出更多的數,所以dp[i][j] = dp[i][i];

當i=j的時候,只能分出一個1出來,dp[i][j] = dp[i][j-1] + 1;

當i>j的時候,至少有一個0的是dp[i][j-1],一個0都沒有的是分出 j 出來,把每個都加個1,剩下i-j分成j個數

dp[i][j]=dp[i][j-1]+dp[i-j][j]。

#include<stdio.h>
#define N 320
long long dp[N][N];
int main()
{
	int n,k,i,j;
	for(i=1;i<N-10;i++)
		for(j=1;j<N-10;j++)
		{
			if(i<j)
				dp[i][j]=dp[i][i];
			else if(i==j)
				dp[i][j]=dp[i][j-1]+1;
			else if(i>j)
				dp[i][j]=dp[i][j-1]+dp[i-j][j];	
		}
	while(scanf("%d%d",&n,&k)!=EOF)
		printf("%lld\n",dp[n][k]);
	return 0;
}