假设我们有一个整数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];
—————————————————————————————————————————————