其他分享
首页 > 其他分享> > 数的划分

数的划分

作者:互联网

题目描述 

将整数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 }

 

 

标签:分法,int,整数,划分,long,include,dp
来源: https://www.cnblogs.com/mxnzqh/p/11997061.html