这道题说白了就一件事:在任意时刻,手握一元钱的同学的钱的数量不得少于手握两元钱的同学的数量。
所以,dp就可以完美解决这个问题(标数法)
详情看代码:
#include <bits/stdc++.h>
using namespace std;
int dp[20][20];
int n;
int main() {
cin >> n;
dp[1][1] = 1;
for (int i = 1; i <= n + 1; i++) { //加一的原因是因为人数可能为由零个人到n个人,是n+1种可能性
for (int j = i; j <= n + 1; j++) { //从i开始是为了防止有两元钱同学超过有一元钱的同学(找不开了)
if (!(i == 1 && j == 1))
dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; //转移方程:上一个加一个一元的同学和另外一个加一个两元的同学
}
}
cout << dp[n + 1][n + 1] << endl; //完美收工
return 0;
}