計蒜客:程式設計:劃分整數
阿新 • • 發佈:2018-11-26
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; }