数的划分(信息学奥赛一本通 1304 洛谷 1025)

题意:把n分成k份,有多少种不同的方法。

当n小的时候深搜是0k的。(6<=n<=200)

所以说要使用动态规划 状态转移方程 ans[k][n]表示把n分成k份的方案数。

ans[0][0]=1; ans[i][j]=ans[i-1][j-1]+ans[i][j-i];

=至少有一个盒子只有一个小球+没有一个盒子只有一个小球

至少有一个盒子只有一个小球:因为盒子相同,所以=份数-1,球数-1

没有一个盒子只有一个小球:把每个盒子都抽出一个小球,所以份数不变,球数-i

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int f[201][201];
 4 int main()
 5 {
 6     int k,n;cin>>n>>k;
 7     for(int i=1;i<=n;i++)
 8         for(int j=1;j<=k;j++)
 9             if(i<j)f[i][j]=0;
10             else if(j==1||i==j)f[i][j]=1;
11             else f[i][j]=f[i-1][j-1]+f[i-j][j];
12     cout<<f[n][k];
13     return 0;
14 }
原文地址:https://www.cnblogs.com/ljy-endl/p/11242617.html