问题描述
每位同学必修 3 门课程,可选修其他 3 门及以上课程。
小 A 同学选了 n
门选修课程,马上要期末考核了,请你帮小 A 同学算一算,如果小 A 同学要及格的话,他所学所有课程的成绩共有多少种组合的方式。
注意:
- 同学的所有学习课程的平均分 >= 60 分 即为及格
- 每门课程满分 100 分,只有 20 道选择题,每题 5 分,答错 0 分,答对 5 分
- 成绩的总组合数对 202220222022 取模
输入
整数 n
(3 <= n <= 1000
)小 A 同学选修的课程数
输出
一个整数,表示小 A 同学所学课程能及格的成绩组合方式个数(对 202220222022 取模即可)
题解:
注意有3门是必修的。
把分数除以5,问题等价于从0,1,…,20中可重复地选n个数,求和满足大于等于12*n的组合数。
dp[i][j]
表示选取 i 个数,和为 j 的组合数。
string solution(int n) {
vector<vector<long long>> dp(n+3+1, vector<long long>(20*(n+3)+1));
dp[0][0] = 1;
for (int i = 1; i <= n+3; i++) {
for (int j = 0; j <= 20 * (n+3); j++) {
for (int k = 0; k <= 20; k++) {
if (j >= k) {
dp[i][j] =(dp[i][j] + dp[i - 1][j - k]) % 202220222022;
}
}
}
}
long long count = 0;
for (int j = 12 * (n+3); j <= 20 * (n+3); j++) {
count = (count + dp[n+3][j]) % 202220222022;
}
return to_string(count);
}