题意:中文题就不说了……
解法:dp。想了半天也想不出来……果然智商被碾压……一定是装×的报应(wwww
考虑为dp[i][j]表示i个苹果放在j个盘子中的情况数。
当苹果数小于盘子数的时候,dp[i][j] = dp[i][i]
当苹果数大于盘子数的时候,dp[i][j] = dp[i][j - 1] + dp[i - j][j]
具体推断过程见http://blog.sina.com.cn/s/blog_6a706bf40100r1zf.html
也可以递归做……哼唧
代码:
#include<stdio.h> #include<iostream> #include<algorithm> #include<string> #include<string.h> #include<math.h> #include<limits.h> #include<time.h> #include<stdlib.h> #include<map> #include<queue> #include<set> #include<stack> #include<vector> #define LL long long using namespace std; int main() { int T; scanf("%d", &T); while(T--) { int n, m; cin >> n >> m; int dp[15][15] = {0}; for(int i = 1; i <= n; i++) dp[i][1] = dp[i][0] = 1; for(int i = 1; i <= m; i++) dp[1][i] = dp[0][i] = 1; for(int i = 2; i <= n; i++) { for(int j = 2; j <= m; j++) { if(i < j) dp[i][j] = dp[i][i]; else { dp[i][j] = dp[i][j - 1] + dp[i - j][j]; } } } cout << dp[n][m] << endl; } return 0; }