RQNOJ 329 刘翔!加油!:01背包
2024-10-11 00:57:07
题目链接:https://www.rqnoj.cn/problem/329
题意:
刘翔有n封信,每封信都有自己的欣赏价值value[i]、消耗时间time[i]、消耗体力h[i]、和得到的鼓舞w[i]。
观看信件必须按照价值递增(大于)的顺序观看,不一定需要全看。
可是,刘翔在伤病中,时间和体力分别为t,m,同时看完之后体力不能为0。
问你受到的鼓舞最大为多少。
题解:
这道题里value[i]真的没有用。。。
表示状态:
dp[i][j][k] = max encouraging
i:考虑到第i封信
j:花费的时间
k:花费的体力
找出答案:
ans = max dp[i][j][k] (0<=j<=t, 0<=k<m)
如何转移:
dp[i][j][k] = max(dp[i-1][j][k], dp[i-1][j-c[i]][k-h[i]] + w[i]) (01背包)
边界条件:
set dp = 0
AC Code:
// state expression:
// dp[i][j][k] = max encouraging
// i: ith letter was considered
// j: time cost
// k: hp cost
//
// find the answer:
// max dp[i][j][k] (0<=j<=t, 0<=k<m)
//
// transferring:
// dp[i][j][k] = max(dp[i-1][j][k], dp[i-1][j-c[i]][k-h[i]] + w[i])
//
// boundary:
// set dp = 0
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 105
#define MAX_T 105
#define MAX_H 105 using namespace std; int n,m,t;
int ans;
int w[MAX_N];
int c[MAX_N];
int h[MAX_N];
int dp[MAX_N][MAX_T][MAX_H]; void read()
{
cin>>n>>m>>t;
int v;
for(int i=;i<=n;i++)
{
cin>>v>>c[i]>>h[i]>>w[i];
}
} void solve()
{
memset(dp,,sizeof(dp));
ans=;
for(int i=;i<=n;i++)
{
for(int j=;j<=t;j++)
{
for(int k=;k<m;k++)
{
dp[i][j][k]=max(dp[i][j][k],dp[i-][j][k]);
if(j-c[i]>= && k-h[i]>=)
{
dp[i][j][k]=max(dp[i][j][k],dp[i-][j-c[i]][k-h[i]]+w[i]);
}
ans=max(ans,dp[i][j][k]);
}
}
}
} void print()
{
cout<<ans<<endl;
} int main()
{
read();
solve();
print();
}
最新文章
- JavaScript单元测试框架JsUnit基本介绍和使用
- PHP-Redis扩展使用手册(二)
- 删除Json中的不需要的键值
- Windows Server 2016软件定义存储:Storage Spaces Direct的关键特性
- java多线程之队列
- activiti参考5-任务TASK
- [js] 小谈 export (没总结完)
- thinkphp实现文件的下载
- STL next_permutation 算法原理和实现
- hdu5521(Meeting)spfa 层次网络最短路
- 使用pytorch构建神经网络的流程以及一些问题
- STM32输入捕获模式设置并用DMA接收数据
- citus 多租户应用开发(来自官方文档)
- golang 如何判断变量的类型
- BZOJ3156 防御准备(动态规划+斜率优化)
- ASP.NET 构建高性能网站 第6篇
- 子墨庖丁Android的ActionBar源代码分析 (一)实例化
- JS事件监听手机屏幕触摸事件 Touch
- Flexbox兼容性
- phpMyAdmin的安装配置