题目描述
将整数n分成k份,且每份不能为空,任意两个方案不相同(不考虑顺序)。
例如:n=7,k=3,下面三种分法被认为是相同的。
1,1,5;
1,5,1;
5,1,1;
问有多少种不同的分法。
输入输出格式
输入格式:
n,k (6<n <=200,2 <=k<=6)
输出格式:
11个整数,即不同的分法。
输入输出样例
输入样例#1
7 3
输出样例#1
4
说明
四种分法为
1,1,5;
1,2,4;
1,3,3;
2,2,3.
解析部分
思路
利用DP,把i平均分成j份,从中再找出数字规律,(如i,j的关系),即可。
解析
我们用dp[i][j]来表示i有几个数,j来表示分成几份,dp[i][j]就表示i个数被分成j份。显然,当i=j时,只有一种情况;当i<j时,就不可能有情况。得dp[0][0]=1;那么第二种情况题目中说了的,他们不可能i<j,因此,这可以省略。
最后,我们来想如果这k个数中不含1时,(如2,2,3),我们就必须将每个数都减1,就成了1,1,2,这时和为4,不够为7,因此,我们还要将地i-1里面j-1的数,用来相加,但是,第j个数必须为1,得dp[i-1][j-1].
综上所述,得转移态方程:dp[i][j]=dp[i-j][j]+dp[i-1][j-1];
这样,可以简化程序。
代码部分
#include <bits/stdc++.h>
using namespace std;
int n,k;
int dp[10

这篇博客探讨了一个整数n如何拆分为k个非空部分的问题,强调了动态规划的解决方案。通过分析输入输出格式和样例,博主解释了如何使用动态规划的思路,提出转移态方程dp[i][j]=dp[i-j][j]+dp[i-1][j-1],以求解不同分法的数量。
最低0.47元/天 解锁文章
504

被折叠的 条评论
为什么被折叠?



