1. 程式人生 > >整數劃分 dp

整數劃分 dp

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

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

輸入格式

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

輸出格式

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

樣例輸入

5 3

樣例輸出

5

#include<stdio.h>
long long n,k,dp[310][310];
int main()
{
    scanf("%lld %lld",&n,&k);
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=k; j++)
        {
            if(i==1||j==1)
                dp[i][j]=1;
            else if(i<j)
                dp[i][j]=dp[i][i];
            else if(i>j)
                dp[i][j]=dp[i-j][j]+dp[i][j-1];
            else
                dp[i][j]=1+dp[i][j-1];
        }
    }
    long long s=dp[n][k];
    printf("%lld\n",s);
    return 0;
}