【算法题】及格如此简单

问题描述

每位同学必修 3 门课程,可选修其他 3 门及以上课程。

小 A 同学选了 n 门选修课程,马上要期末考核了,请你帮小 A 同学算一算,如果小 A 同学要及格的话,他所学所有课程的成绩共有多少种组合的方式。

注意

  1. 同学的所有学习课程的平均分 >= 60 分 即为及格
  2. 每门课程满分 100 分,只有 20 道选择题,每题 5 分,答错 0 分,答对 5 分
  3. 成绩的总组合数对 202220222022 取模

输入

整数 n3 <= 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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值