#include<iostream> using namespace std; int dp[210][16]; int main() { 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++)//分成一份的时候跳过,从2开始 { if(i>=j)dp[i][j]=dp[i-j][j]+dp[i-1][j-1]; /*k>n情况数肯定是0; 当 i>=j时,缩小规模,分成两类讨论: 1.当至少有一个等于一,我们便可以缩小它的规模, 变成研究,dp[i-1][j-1]的情况数; 2. 当所有的都大于等于2,实际上也就等于每一份里面减去一个一, 而份数不变的情况dp[i-j][j] */ } cout<<dp[n][k]<<endl; } /************************************************************** Problem: 1857 User: admin Language: C++ Result: Accepted Time:38 ms Memory:2088 kb ****************************************************************/