首页 > 其他 > 详细

数的划分

时间:2019-12-06 20:15:18      阅读:78      评论:0      收藏:0      [点我收藏+]

题目描述 

将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。
例如:n=7,k=3,下面三种分法被认为是相同的。
1,1,5; 1,5,1; 5,1,1;
问有多少种不同的分法。
输入:n,k ( 6 < n ≤ 200,2 ≤ k ≤ 6 )
输出:一个整数,即不同的分法。

输入描述:

两个整数 n,k ( 6 < n ≤ 200, 2 ≤ k ≤ 6 )

输出描述:

1个整数,即不同的分法。
示例1

输入

复制
7 3

输出

复制
4
解析:
dp[i][j]表示将数i分成j份,于是我们可以得出
dp[i][j]=dp[i-j][1]+dp[i-j][2]+dp[i-j][3]+...+dp[i-j][j]
dp[i-1][j-1]=dp[i-1-j+1][1]+dp[i-1-j+1][2]+...+dp[i-1-j+1][j-1]
=dp[i][j]-dp[i-j][j]
由上面这两个式子可以得出一个比较简洁的动规方程式:
dp[i][j]=dp[i-j][j]+dp[i-1][j-1]
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <string>
 5 #include <cstring>
 6 #include <cstdlib>
 7 #include <cmath>
 8 #include <stack>
 9 #include <queue>
10 #include <set>
11 #include <map>
12 #include <vector>
13 #include <ctime>
14 #include <cctype>
15 #include <bitset>
16 #include <utility>
17 #include <sstream>
18 #include <complex>
19 #include <iomanip>
20 #define inf 0x3f3f3f3f
21 typedef long long ll;
22 using namespace std;
23 int dp[210][7];//dp[i][j]表示将i分成j份
24 int n,k;
25 int main()
26 {
27     cin>>n>>k;
28     dp[0][0]=1;
29     for(int i=1; i<=n; i++)
30     {
31         for(int j=1; j<=k; j++)
32         {
33             if(i>=j)//当前要划分的数得大于划分的份数
34                 dp[i][j]=dp[i-j][j]+dp[i-1][j-1];
35         }
36     }
37     cout<<dp[n][k]<<endl;
38     return 0;
39 }

 

 

数的划分

原文:https://www.cnblogs.com/mxnzqh/p/11997061.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!