数的划分
作者:互联网
题目描述
将整数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