• AcWing 286. 选课,《算法竞赛进阶指南》


    286. 选课 - AcWing题库

    学校实行学分制。

    每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分。

    学校开设了 N 门的选修课程,每个学生可选课程的数量 M 是给定的。

    学生选修了这 M 门课并考核通过就能获得相应的学分。

    在选修课程中,有些课程可以直接选修,有些课程需要一定的基础知识,必须在选了其他的一些课程的基础上才能选修。

    例如《Windows程序设计》必须在选修了《Windows操作基础》之后才能选修。

    我们称《Windows操作基础》是《Windows程序设计》的先修课。

    每门课的直接先修课最多只有一门。

    两门课可能存在相同的先修课。

    你的任务是为自己确定一个选课方案,使得你能得到的学分最多,并且必须满足先修条件。

    假定课程之间不存在时间上的冲突。

    输入格式

    输入文件的第一行包括两个整数 N、M(中间用一个空格隔开)其中 1≤N≤300,1≤M≤N。

    接下来 N 行每行代表一门课,课号依次为 1,2,…,N

    每行有两个数(用一个空格隔开),第一个数为这门课先修课的课号(若不存在先修课则该项为 0),第二个数为这门课的学分。

    学分是不超过 10 的正整数。

    输出格式

    输出一个整数,表示学分总数。

    输入样例:
    1. 7 4
    2. 2 2
    3. 0 1
    4. 0 4
    5. 2 1
    6. 7 1
    7. 7 6
    8. 2 2
    输出样例:
    13

     解析:

    这道题的状态转移方程并不难,关键是注意体积从大到小遍历,因为这是一个分组背包问题

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include
    11. #include
    12. #include
    13. #include
    14. #include
    15. using namespace std;
    16. typedef long long LL;
    17. const int N = 305;
    18. vector<int>G[N];
    19. int n, m;
    20. int f[N][N], w[N];
    21. void dfs(int a) {
    22. for (int i = 0; i < G[a].size(); i++) {
    23. int p = G[a][i];
    24. dfs(p);
    25. for (int j = m-1; j > 0; j--) {
    26. for (int k = 1; k <= j; k++) {
    27. f[a][j] = max(f[a][j], f[a][j - k] + f[p][k]);
    28. }
    29. }
    30. }
    31. for (int i = m; i > 0; i--) {
    32. f[a][i] = f[a][i - 1] + w[a];
    33. }
    34. }
    35. int main() {
    36. scanf("%d%d", &n, &m);
    37. for (int i = 1, a; i <= n; i++) {
    38. scanf("%d%d", &a, &w[i]);
    39. G[a].push_back(i);
    40. }
    41. m++;
    42. dfs(0);
    43. cout << f[0][m] << endl;
    44. return 0;
    45. }

  • 相关阅读:
    [附源码]java毕业设计小区疫情防控系统
    82 # koa-bodyparser 中间件的使用以及实现
    css3新单位vw、vh、vmin、vmax的使用介绍
    基于C#和OpenVINO在英特尔独立显卡上部署PP-TinyPose模型
    【Spring篇 | 补充】三级缓存解决循环依赖
    RTMP协议和源码解析
    配置anaconda+安装cuda和cudnn+将cuda和cudnn配置到指定目录+使用cuda命令安装cuda和cudnn
    Blazor前后端框架Known-V1.2.15
    Windows之应用安装程序 —— winget
    Spring及SpringMvc
  • 原文地址:https://blog.csdn.net/Landing_on_Mars/article/details/133528542