题目描述 Description
将整数n分成k份,且每份不能为空,任意两种划分方案不能相同(不考虑顺序)。
例如:n=7,k=3,下面三种划分方案被认为是相同的。
1 1 51 5 1
5 1 1
问有多少种不同的分法。输入描述 Input Description
输入:n,k (6<n<=200,2<=k<=6)
输出描述 Output Description
输出:一个整数,即不同的分法。
样例输入 Sample Input
7 3
样例输出 Sample Output
4
数据范围及提示 Data Size & Hint
{四种分法为:1,1,5;1,2,4;1,3,3;2,2,3;}
dp[i][j]表示前i分成j份有几种分法
dp[i][j]=dp[i-1][j-1](至少分出一个1)+dp[i-j][j](分出的数都大于1的情况,j个1为基础,把i-j分成j份分别加上去)
dp[k][1]=1
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef double db; #define X first #define Y second #define mp(a,b) make_pair(a,b) #define pb push_back #define sd(x) scanf("%d",&(x)) #define Pi acos(-1.0) #define sf(x) scanf("%lf",&(x)) #define ss(x) scanf("%s",(x)) #define maxn 50005 const int inf=0x3f3f3f3f; const ll mod=1000000007; ll dp[205][10]; int main() { #ifdef local freopen("in","r",stdin); //freopen("out","w",stdout); int _time=clock(); #endif int n,k; cin>>n>>k; for(int i=1;i<=n;i++) dp[i][1]=1; for(int i=1;i<=n;i++) { for(int j=2;j<=k;j++) { dp[i][j]=dp[i-1][j-1]+(i>=j?dp[i-j][j]:0); } } cout<<dp[n][k]<<endl; #ifdef local printf("time: %d\n",int(clock()-_time)); #endif }
时间: 2024-12-21 05:23:58