import java.util.*; /** * NC152 数的划分 * @author d3y1 */ public class Solution { private final int MOD = 1000000007; /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param n int整型 被划分的数 * @param k int整型 化成k份 * @return int整型 */ public int divideNumber (int n, int k) { return solution(n, k); } /** * 动态规划 * * dp[i][j]表示将整数i分成j份的方案数 * * i<j时 * dp[i][j] = 0 * * i=j时 * dp[i][j] = 1 * * i>j时: * 2种分法 * (1) 先把第1份置为1(保证该种分法至少有一份为1), 剩下i-1分到其余j-1份中, 有dp[i-1][j-1]种方案 * (2) 先把所有j份置1(保证该种分法所有份至少为2), 剩下i-j分到j份中, 有dp[i-j][j]种方案 * * 可见递推式: * * { 0 , i<j * dp[i][j] = { 1 , i=j * { dp[i-1][j-1] + dp[i-j][j] , i>j * * @param n * @param k * @return */ private int solution(int n, int k){ int[][] dp = new int[n+1][k+1]; dp[0][0] = 1; for(int i=1; i<=n; i++){ for(int j=1; j<=k; j++){ if(i >= j){ dp[i][j] = (dp[i-1][j-1] + dp[i-j][j]) % MOD; } } } return dp[n][k]; } }