题目描述
将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。
例如:n=7,k=3,下面三种分法被认为是相同的。
1,1,5; 1,5,1; 5,1,1;
问有多少种不同的分法。输入数据
输入 n,k (6<n≤200,2≤k≤6)
输出数据
一个整数,即不同的分法。
样例输入
7 3
样例输出
4
解析:动态规划,dp[i][j] 表示 数字 i,被分解为 j 份 的方案总数
状态转移方程: dp[i][j]=dp[i-j][j]+dp[i-1][j-1] (j<=i)
因为分解的每一份不能为空,则先将每一份都分配 1,剩余数值为 i-j ,再将 i-j 分为 1 份,2份,...,j份。
即 dp[i][j] = dp[i-j][1]+dp[i-j][2]+...+dp[i-j][j]
又 dp[i-1][j-1] = dp[i-j][1]+dp[i-j][2]+...+dp[i-j][j-1]
两式相减,可得 dp[i][j]=dp[i-j][j]+dp[i-1][j-1]
完整代码:
#include<iostream> using namespace std; int dp[205][10]; int main(){ int n,k; cin>>n>>k; dp[0][0]=1; for(int i=1; i<=n; i++){ for(int j=1; j<=i && j<=k; j++){ dp[i][j]=dp[i-j][j]+dp[i-1][j-1]; } } cout<<dp[n][k]<<endl; return 0; }