题目链接:https://www.rqnoj.cn/problem/624

题意:

  小明有奖学金啦!所以他要去买运动鞋。

  总共有n款鞋,分别属于t个品牌。

  每款鞋的价格为c[i],在小明心目中的价值为w[i]。

  小明只有m元的奖学金。

  小明同学有强迫症,每个品牌都要至少买一双,并且同一款不会买两双。

  问你所买的鞋在小明心目中的价值之和最大为多少。

题解:

  表示状态:

    dp[i][j][k][p] = max value

    i:考虑到第i个品牌

    j:考虑到第i个品牌中的第j款鞋

    k:当前花费

    p:第i个品牌是否至少买了一双 (p == 0 / 1)

  找出答案:

    max dp[t][0][k][0] (0<=k<=m)

    考虑到第t个品牌(不存在)的第一双鞋。

  如何转移:

    now: dp[i][j][k][p]

    三种决策:

      (1)买当前的鞋,接下来考虑当前品牌的下一款鞋  (买)

      (2)不买当前的鞋,接下来考虑当前品牌的下一款鞋 (不买)

      (3)买当前的鞋,接下来考虑下一个品牌的第一款鞋 (下个品牌)

    对应方程:

      dp[i][j+1][k+c[i][j]][1] = dp[i][j][k][p] + w[i][j]

      dp[i][j+1][k][p] = dp[i][j][k][p]

      dp[i+1][0][k][0] = dp[i][j][k][1]

  边界条件:

    dp[0][0][0][0] = 0

    others = -1

AC Code:

  1. // state expression:
  2. // dp[i][j][k][p] = max value
  3. // i: considering ith brand
  4. // j: considering jth shoes
  5. // k: present cost
  6. // p: whether ith brand has been boungth (p == 0/1)
  7. //
  8. // find the answer:
  9. // max dp[t][0][k][0]
  10. //
  11. // transferring:
  12. // now: dp[i][j][k][p]
  13. // dp[i][j+1][k+c[i][j]][1] = dp[i][j][k][p] + w[i][j]
  14. // dp[i][j+1][k][p] = dp[i][j][k][p]
  15. // dp[i+1][0][k][0] = dp[i][j][k][1]
  16. //
  17. // boundary:
  18. // dp[0][0][0][0] = 0
  19. #include <iostream>
  20. #include <stdio.h>
  21. #include <string.h>
  22. #define MAX_N 105
  23. #define MAX_T 15
  24. #define MAX_C 10005
  25.  
  26. using namespace std;
  27.  
  28. int n,m,t;
  29. int x,y,z;
  30. int ans;
  31. int dp[MAX_T][MAX_N][MAX_C][];
  32. int cnt[MAX_T];
  33. int c[MAX_T][MAX_N];
  34. int w[MAX_T][MAX_N];
  35.  
  36. void read()
  37. {
  38. memset(cnt,,sizeof(cnt));
  39. cin>>n>>m>>t;
  40. for(int i=;i<n;i++)
  41. {
  42. cin>>x>>y>>z;
  43. c[x][cnt[x]]=y;
  44. w[x][cnt[x]]=z;
  45. cnt[x]++;
  46. }
  47. }
  48.  
  49. void solve()
  50. {
  51. ans=-;
  52. memset(dp,-,sizeof(dp));
  53. dp[][][][]=;
  54. for(int i=;i<=t;i++)
  55. {
  56. for(int j=;j<=cnt[i];j++)
  57. {
  58. for(int k=;k<=m;k++)
  59. {
  60. for(int p=;p<;p++)
  61. {
  62. if(dp[i][j][k][p]!=-)
  63. {
  64. if(k+c[i][j]<=m && j+<=cnt[i])
  65. {
  66. dp[i][j+][k+c[i][j]][]=max(dp[i][j+][k+c[i][j]][],dp[i][j][k][p]+w[i][j]);
  67. }
  68. if(j+<=cnt[i])
  69. {
  70. dp[i][j+][k][p]=max(dp[i][j+][k][p],dp[i][j][k][p]);
  71. }
  72. dp[i+][][k][]=max(dp[i+][][k][],dp[i][j][k][]);
  73. }
  74. }
  75. }
  76. }
  77. }
  78. for(int j=;j<=m;j++)
  79. {
  80. ans=max(ans,dp[t+][][j][]);
  81. }
  82. }
  83.  
  84. void print()
  85. {
  86. if(ans==-) cout<<"Impossible"<<endl;
  87. else cout<<ans<<endl;
  88. }
  89.  
  90. int main()
  91. {
  92. read();
  93. solve();
  94. print();
  95. }

RQNOJ 624 运动鞋:dp的更多相关文章

  1. UVA 624 CD(DP + 01背包)

    CD You have a long drive by car ahead. You have a tape recorder, but unfortunately your best music i ...

  2. RQNOJ 188 购物问题:树形dp

    题目链接:https://www.rqnoj.cn/problem/188 题意: 商场以超低价格出售n个商品,购买第i个商品所节省的金额为w[i]. 为了防止亏本,有m对商品是不能同时买的.但保证商 ...

  3. RQNOJ 569 Milking Time:dp & 线段问题

    题目链接:https://www.rqnoj.cn/problem/569 题意: 在一个数轴上可以摆M个线段,每个线段的起始终止端点给定(为整数),且每个线段有一个分值,问如何从中选取一些线段使得任 ...

  4. RQNOJ 514 字串距离:dp & 字符串

    题目链接:https://www.rqnoj.cn/problem/514 题意: 设有字符串X,我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为”abcbcd”,则字 ...

  5. RQNOJ 328 炮兵阵地:状压dp

    题目链接:https://www.rqnoj.cn/problem/328 题意: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队. 一个N*M的地图由N行M列组成(N≤100,M≤10), ...

  6. RQNOJ 311 [NOIP2000]乘积最大:划分型dp

    题目链接:https://www.rqnoj.cn/problem/311 题意: 给你一个长度为n的数字,用t个乘号分开,问你分开后乘积最大为多少.(6<=n<=40,1<=k&l ...

  7. RQNOJ 169 最小乘车费用:水dp

    题目链接:https://www.rqnoj.cn/problem/169 题意: 给出行驶1-10公里的费用(所有车一样),可以倒车,问行驶n公里的最小费用. 题解: 大水题... (=´ω`=) ...

  8. RQNOJ 140 分配时间:dp

    题目链接:https://www.rqnoj.cn/problem/140 题意: 小王参加的考试是几门科目的试卷放在一起考,一共给t分钟来做. 他现在已经知道第i门科目花k分钟可以拿到w[i][k] ...

  9. RQNOJ 622 最小重量机器设计问题:dp

    题目链接:https://www.rqnoj.cn/problem/622 题意: 一个机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得. w[i][j]是从供应商j处购得的部件i的重量, ...

随机推荐

  1. java命令行

    Launches a Java application. Synopsis java [options] classname [args] java [options] -jar filename [ ...

  2. 【C语言学习】封装和模块化思想

    刚学习完C后,做的关于C的课程设计是在一个源文件里放了几百行代码,并且各个功能之间都是相互依赖的,这样就会非常麻烦. 由于当我要改动某个地方的时候,就会牵连着要改动喝多的地方.而在实际的程序设计中.这 ...

  3. 浅谈js中的MVC

    MVC是什么? MVC是一种架构模式,它将应用抽象为3个部分:模型(数据).视图.控制器(分发器) 本文将用一个经典的例子todoList来展开 一个事件发生的过程(通信单向流动): 1.用户在视图V ...

  4. Linux禁止Ctrl+Alt+Del重新启动

    方法1:改动/etc/inittab 屏蔽 ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now 或者删除改行内容 保存退出 适用对象:RedHat4.8 ...

  5. sprint3 【每日scrum】 TD助手站立会议第六天

    站立会议 组员 昨天 今天 困难 签到 刘铸辉 (组长) 在添加日程类型处添加了选择闹钟间隔多长时间相应,并写了闹钟运行的类 在日历各个事件上都增加闹钟显示,并将数据传递给日程和时间表 感觉跟楠哥在设 ...

  6. Visual Studio 2017 for Mac Preview

    Microsoft Visual Studio 2017 for Mac Preview 下载+安装+案例Demo 目录: 0. 前言 1. 在线安装器 2. 安装VS 3. HelloWorld 4 ...

  7. StringBuilder的append、StringBuffer的append和String str = "a"+"b"的区别?

    大家都知道String+String会开销额外的系统资源,粗略的原因是String是不可变类,每一步操作都会返回新的String变量,占用空间及时间. 其实我的理解不是这样的,我们来看看String+ ...

  8. Angualr 实现复选框全选功能

    html <html lang="en"> <head> <meta charset="UTF-8"> <title& ...

  9. 018 nginx与第三模块整合[一致性哈希模块整合]

    nginx第三方模块官网:http://wiki.nginx.org/HttpUpstreamConsistentHash nginx第三方模块下载地址:https://github.com/repl ...

  10. 图像处理之canny---求梯度

    梯度求法和sobel之类的算子雷同,甚至更简单,就是一个离散差分,不清楚的童鞋可以百度,一大堆资料呢,从源码也可清晰的看出原理. // 方向导数,求梯度/* * @parameter sz: 图像大小 ...