RQNOJ 624 运动鞋:dp
题目链接: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:
- // state expression:
- // dp[i][j][k][p] = max value
- // i: considering ith brand
- // j: considering jth shoes
- // k: present cost
- // p: whether ith brand has been boungth (p == 0/1)
- //
- // find the answer:
- // max dp[t][0][k][0]
- //
- // transferring:
- // now: dp[i][j][k][p]
- // 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]
- //
- // boundary:
- // dp[0][0][0][0] = 0
- #include <iostream>
- #include <stdio.h>
- #include <string.h>
- #define MAX_N 105
- #define MAX_T 15
- #define MAX_C 10005
- using namespace std;
- int n,m,t;
- int x,y,z;
- int ans;
- int dp[MAX_T][MAX_N][MAX_C][];
- int cnt[MAX_T];
- int c[MAX_T][MAX_N];
- int w[MAX_T][MAX_N];
- void read()
- {
- memset(cnt,,sizeof(cnt));
- cin>>n>>m>>t;
- for(int i=;i<n;i++)
- {
- cin>>x>>y>>z;
- c[x][cnt[x]]=y;
- w[x][cnt[x]]=z;
- cnt[x]++;
- }
- }
- void solve()
- {
- ans=-;
- memset(dp,-,sizeof(dp));
- dp[][][][]=;
- for(int i=;i<=t;i++)
- {
- for(int j=;j<=cnt[i];j++)
- {
- for(int k=;k<=m;k++)
- {
- for(int p=;p<;p++)
- {
- if(dp[i][j][k][p]!=-)
- {
- if(k+c[i][j]<=m && j+<=cnt[i])
- {
- dp[i][j+][k+c[i][j]][]=max(dp[i][j+][k+c[i][j]][],dp[i][j][k][p]+w[i][j]);
- }
- if(j+<=cnt[i])
- {
- dp[i][j+][k][p]=max(dp[i][j+][k][p],dp[i][j][k][p]);
- }
- dp[i+][][k][]=max(dp[i+][][k][],dp[i][j][k][]);
- }
- }
- }
- }
- }
- for(int j=;j<=m;j++)
- {
- ans=max(ans,dp[t+][][j][]);
- }
- }
- void print()
- {
- if(ans==-) cout<<"Impossible"<<endl;
- else cout<<ans<<endl;
- }
- int main()
- {
- read();
- solve();
- print();
- }
RQNOJ 624 运动鞋:dp的更多相关文章
- 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 ...
- RQNOJ 188 购物问题:树形dp
题目链接:https://www.rqnoj.cn/problem/188 题意: 商场以超低价格出售n个商品,购买第i个商品所节省的金额为w[i]. 为了防止亏本,有m对商品是不能同时买的.但保证商 ...
- RQNOJ 569 Milking Time:dp & 线段问题
题目链接:https://www.rqnoj.cn/problem/569 题意: 在一个数轴上可以摆M个线段,每个线段的起始终止端点给定(为整数),且每个线段有一个分值,问如何从中选取一些线段使得任 ...
- RQNOJ 514 字串距离:dp & 字符串
题目链接:https://www.rqnoj.cn/problem/514 题意: 设有字符串X,我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为”abcbcd”,则字 ...
- RQNOJ 328 炮兵阵地:状压dp
题目链接:https://www.rqnoj.cn/problem/328 题意: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队. 一个N*M的地图由N行M列组成(N≤100,M≤10), ...
- RQNOJ 311 [NOIP2000]乘积最大:划分型dp
题目链接:https://www.rqnoj.cn/problem/311 题意: 给你一个长度为n的数字,用t个乘号分开,问你分开后乘积最大为多少.(6<=n<=40,1<=k&l ...
- RQNOJ 169 最小乘车费用:水dp
题目链接:https://www.rqnoj.cn/problem/169 题意: 给出行驶1-10公里的费用(所有车一样),可以倒车,问行驶n公里的最小费用. 题解: 大水题... (=´ω`=) ...
- RQNOJ 140 分配时间:dp
题目链接:https://www.rqnoj.cn/problem/140 题意: 小王参加的考试是几门科目的试卷放在一起考,一共给t分钟来做. 他现在已经知道第i门科目花k分钟可以拿到w[i][k] ...
- RQNOJ 622 最小重量机器设计问题:dp
题目链接:https://www.rqnoj.cn/problem/622 题意: 一个机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得. w[i][j]是从供应商j处购得的部件i的重量, ...
随机推荐
- java命令行
Launches a Java application. Synopsis java [options] classname [args] java [options] -jar filename [ ...
- 【C语言学习】封装和模块化思想
刚学习完C后,做的关于C的课程设计是在一个源文件里放了几百行代码,并且各个功能之间都是相互依赖的,这样就会非常麻烦. 由于当我要改动某个地方的时候,就会牵连着要改动喝多的地方.而在实际的程序设计中.这 ...
- 浅谈js中的MVC
MVC是什么? MVC是一种架构模式,它将应用抽象为3个部分:模型(数据).视图.控制器(分发器) 本文将用一个经典的例子todoList来展开 一个事件发生的过程(通信单向流动): 1.用户在视图V ...
- Linux禁止Ctrl+Alt+Del重新启动
方法1:改动/etc/inittab 屏蔽 ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now 或者删除改行内容 保存退出 适用对象:RedHat4.8 ...
- sprint3 【每日scrum】 TD助手站立会议第六天
站立会议 组员 昨天 今天 困难 签到 刘铸辉 (组长) 在添加日程类型处添加了选择闹钟间隔多长时间相应,并写了闹钟运行的类 在日历各个事件上都增加闹钟显示,并将数据传递给日程和时间表 感觉跟楠哥在设 ...
- Visual Studio 2017 for Mac Preview
Microsoft Visual Studio 2017 for Mac Preview 下载+安装+案例Demo 目录: 0. 前言 1. 在线安装器 2. 安装VS 3. HelloWorld 4 ...
- StringBuilder的append、StringBuffer的append和String str = "a"+"b"的区别?
大家都知道String+String会开销额外的系统资源,粗略的原因是String是不可变类,每一步操作都会返回新的String变量,占用空间及时间. 其实我的理解不是这样的,我们来看看String+ ...
- Angualr 实现复选框全选功能
html <html lang="en"> <head> <meta charset="UTF-8"> <title& ...
- 018 nginx与第三模块整合[一致性哈希模块整合]
nginx第三方模块官网:http://wiki.nginx.org/HttpUpstreamConsistentHash nginx第三方模块下载地址:https://github.com/repl ...
- 图像处理之canny---求梯度
梯度求法和sobel之类的算子雷同,甚至更简单,就是一个离散差分,不清楚的童鞋可以百度,一大堆资料呢,从源码也可清晰的看出原理. // 方向导数,求梯度/* * @parameter sz: 图像大小 ...