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的重量, ...
随机推荐
- Wireshark网络分析实战笔记(三)基本信息统计工具的使用方法
Capture File Properties:获取网络中数据包的整体信息 用法:Statistics菜单条下Capture File Properties选项 Protocol Hierarchy: ...
- Android中的Telephony学习笔记(2)
上一篇文章中学习了android.provider中Telephony类. 这一篇文章学习android.telephony包中的类,这些类是android提供给上层调用的API. 为监測基本电话信息 ...
- 浅谈PHP与手机APP开发即API接口开发
API(Application Programming Interface,应用程序接口)架构,已经成为目前互联网产品开发中常见的软件架构模式,并且诞生很多专门API服务的公司,如:聚合数据(http ...
- ios控件自定义指引
转载自:http://bbs.9ria.com/thread-256747-1-1.html 一直以来都想写点什么,做点有意义的事,从今天开始我将会把自己在这一年的学习和应用IOS开发中的学习心得和体 ...
- shell函数传递带空格的参数
shell中的参数以空格为分割符,经常会碰到需要传递带空格的参数,例如传递带空格的文件名. 方法很简单:给参数加双引号. 但是实际效果要看你的函数内容,一种可能的情况是: 其实你真的传递进去了带空格的 ...
- bzoj4010【HNOI2015】菜肴制作
4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec Memory Limit: 512 MB Submit: 981 Solved: 480 [Submit][Statu ...
- 本地aar文件引用
有时须要使用第三方的aar库.或是project源码越来越大.项目内分工须要或出于模块化考虑.须要引用aar文件. arr就像C/C++中的静态库. 怎样建一个aar.网上的文章非常多,这里不再重述. ...
- android 怎样加速./mk snod打包
mm命令高速编译一个模块之后,一般用adb push到手机看效果,假设环境不同意用adb push或模块不常常改.希望直接放到image里,则能够用./mk snod,这个命令只将system文件夹打 ...
- Java方法存在于哪一区
Java运行时的数据区包括:(其中前两个是线程共享的) 1.方法区(Method Area)存储已被虚拟机加载的类信息.常量.静态变量.即编译器编译后的代码等数据 2.堆(Heap)存放对象实例,几乎 ...
- Tinker 热修复框架 简单上手教程
当你们看到Tinker的时候是不是有点愣逼这个是什么东西? 简单来说就是不需要重新下载app和重新安装app 来进行更新app的技术框架. 看看这个吧,我也是才学习 ,先做个学习记录 参考:Tinke ...