你们必定小时候都作过不少奇奇怪怪的分水果的题目,好比7个小朋友分3个苹果,切4刀怎么分比较合理。c++
然而咱们今天要分的是车厘子,天然不可能把车厘子切开来分。事实上,负责分配车厘子的Gyy也很随意,他只要能把给定的n个车厘子分红k份就能够了,根本不在意谁多谁少,请帮忙Gyy算一下,一共会有多少种分配方案。请注意,每份不能为空,若是一种分法可以经过调换顺序变成另外一种,那么认为他们是相同的,好比:spa
1,1,8;8,1,1;1,8,1;这三种分法视为同一种方案。设计
输入共一行,给出两个整数n,k,其中6<n≤200,2≤k≤6。code
输出共一行,即不一样的分法的方案数。ci
7 3it
4程序设计
四种分法为:1,1,5; 1,2,4; 1,3,3; 2,2,3。搜索
思路:本题的数据范围很小,直接用搜索就能AC,时间复杂度O(n^k)。
但若是数据范围稍微增大一些,显然搜索就会超时!
所以能够用一种巧妙的dp作法解决此问题。
状态表示:dp[i][j]表示将i个车厘子分红j个的方法数。
状态转移:咕咕咕。
代码:程序
#include<bits/stdc++.h> #include<queue> using namespace std; int dp[200][10]; int main(){ int n,k; cin>>n>>k; for (int i=1; i<=n; i++) for (int j=1; j<=i; j++){ if (j==1 || j==i) dp[i][j]=1; else dp[i][j]=dp[i-1][j-1]+dp[i-j][j]; } printf("%d",dp[n][k]); return 0; }