假设我们有一个整数n,我们要对它在约束条件不同的情况下进行划分。

1.把n划分成不小于m(且为正整数)的划分数

2.把n划分成为k个正整数的划分数

3.把n划分成k个奇数的划分数


1.把n划分成不小于m(且为正整数)的划分数

—————————————————————————————————————————————

状态dp[i][j]代表把i划分为不小于j的划分数。

1.把n划分为不小于m但可以存在相同数时的划分数

    这种情况的划分数的方案可以分为两类1.不包括m

                                                              2.至少包括一个m;

    第一类:dp[n][m-1],我们可以看做把n划分为小于m的划分数,就能保证不包括m;

    第二类:dp[n-m][m], 我们可以看做把对n去掉m后的数,进行不小于m的划分,就能保证至少包括一个m;

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


2.把n划分为不小于m,且每个人数都不相同时的划分数

    这种情况的划分数的方案可以分为两类1.不包括m

                                                              2.只有一个m

    第一类:dp[n][m-1],我们可以看做把n划分为小于m的划分数,就能保证不包括m;

    第二类:dp[n-m][m-1], 我们可以看做把对n去掉m后的数,进行小于m的划分,就能保证只包括一个m;

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

—————————————————————————————————————————————


2.把n划分为k个正整数的划分数

—————————————————————————————————————————————

状态dp[i][j] 为把i划分为j个正整数的划分数

1.把n划分为k个可以相等的数的划分数

    这种情况可以分为两类1.至少一个1

                                      2.一个1也没有(也可以看做都是>=2)

    第一类:dp[n-1][k-1],我们可以先拿出一个1分配到其中一份,接着将剩下的n-1分配到k-1份上,就能保证

                  至少一个1;

    第二类:dp[n-k][k],我们可以先拿出k个1平均分配到k份(这个保证了每个都为1),接着将剩下n-k分配到

                  k份(保证每份中至少分配到1),就能保证k份中一个1也没有。(因为1加上一个大于等于1的数

                   一定>=2)。

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


2.把n划分为k个不相等的数的划分数

    这种情况可以分为两类1.只有一个1

                                      2.一个1也没有(也可以看做都是>=2)

    第一类:dp[n-k][k-1],我们可以先拿出k个1平均分配到k份(这个保证了每个都为1),接着将剩下n-k分配

                  到k-1份(保证除了一份有1外,其他的都>=2),就能保证k份中除了一份有1其它的都>=1(只有一

                  个1);

    第二类:dp[n-k][k],我们可以先拿出k个1平均分配到k份(这个保证了每个都为1),接着将剩下n-k分配到

                  k份(保证每份中至少分配到1),就能保证k份中一个1也没有。(因为1加上一个大于等于1的数一

                  定>=2)。

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

—————————————————————————————————————————————


3.把n划分为k个奇数的划分数

—————————————————————————————————————————————

dp[i][j]为把i划分为j个奇数的划分数

1.把n划分为k个可以相同的奇数的划分数

    这种情况可以分为两类1.至少一个1

                                      2.一个1也没有(也可以看做>=3,因为必须是奇数)

    第一类:dp[n-1][k-1],我们可以先拿出一个1分配到其中一份,接着将剩下的n-1分配到k-1份上,就能保证

                  至少一个1;

    第二类:dp[n-2*k][k],我们可以先拿出k个2分配到其中的k份,接下来的n-2*k分配到k份中(这样就保证了

                  每份都>=3,也就是一个1也没有);

dp[i][j]=dp[i-1][j-1]+dp[i-2*k][k];


2.把n划分为k个不相同的奇数的划分数

    这种情况可以分为两类1.只有一个1

                                      2.一个1也没有(也可以看做>=3,因为必须是奇数)

    第一类:dp[i-2*k+1][k-1],dp[i-2*k+1][k-1]可以看做dp[i-2*(k-1)-1][k-1],我们可以拿出(k-1)个2平均分配

                  (k-1)份上,然后拿出一个1分配到不为2的那一份上。接下来将i-2*(k-1)-1分配到都为2的(k-1)份上

                  这样就保证了这k-1份都>=3;

    第二类:dp[n-2*k][k],我们可以先拿出k个2分配到其中的k份,接下来的n-2*k分配到k份中(这样就保证了

                  每份都>=3,也就是一个1也没有);

dp[i][j]=dp[i-2*k+1][k-1]+dp[i-2*k][k];

—————————————————————————————————————————————