HDU3496 Watch the Movie 背包
2024-09-02 01:10:18
题目大意:给你n张电影门票,但一次只可以买m张,并且你最多可以看L分钟,接下来是n场电影,每一场电影a分钟,b价值,要求恰好看m场电影所得到的最大价值,要是看不到m场电影,输出0。
三个限制:
- 选电影门票的范围;
- 总共观看的时间;
- 买的票数严格为m。
因此,将第一维滚动处理,第二三维初值负无穷(因为是严格为m),倒序递推,最后取DP[m]中的最大值即可。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int MAX_OBJ = , MAX_V = , MAX_CNT = MAX_OBJ;
//DP(obj, v, cnt)=max{DP(obj-1, v, cnt), DP(obj-1, v-objV[obj], cnt-1)+objW[obj]}
int DP(int totV, int totObj, int totCnt, int *objV, int *objW)
{
static int DP[MAX_CNT][MAX_V];
memset(DP, 0xcf, sizeof(DP));
DP[][] = ;
for (int obj = ; obj <= totObj; obj++)
for (int cnt = totCnt; cnt >= ; cnt--)
for (int v = totV; v >= ; v--)
if (v >= objV[obj])
DP[cnt][v] = max(DP[cnt][v], DP[cnt - ][v - objV[obj]] + objW[obj]);
int ans = ;
for (int v = ; v <= totV; v++)
ans = max(ans, DP[totCnt][v]);
return ans;
} int main()
{
#ifdef _DEBUG
freopen("c:\\noi\\source\\input.txt", "r", stdin);
#endif
static int objV[MAX_OBJ], objW[MAX_OBJ];
int T, totObj, objLimit, totV;
scanf("%d", &T);
while (T--)
{
memset(objV, , sizeof(objV));
memset(objW, , sizeof(objW));
scanf("%d%d%d", &totObj, &objLimit, &totV);
for (int i = ; i <= totObj; i++)
scanf("%d%d", i + objV, i + objW);
printf("%d\n", DP(totV, totObj, objLimit, objV, objW));
}
return ;
}
最新文章
- 前端福利!10个短小却超实用的JavaScript 代码段
- 使用XSD校验Mybatis的SqlMapper配置文件(1)
- LeetCode Search a 2D Matrix(二分查找)
- hdu 4055 动态规划
- Java泛型反射机制(二)
- Django的请求流程(url)
- Node.js REPL终端
- 切图教程,PS和AI切图方法分享
- Linux ssh双向免密认证
- JAVA_SE基础——52.匿名内部类
- python中__del__使用方法
- ECMAScript 6 字符串的扩展
- HTML5的学习(一)HTML5标签
- python线程进程
- MVC客户端使用 Mustache.js把json数据填充到模版中
- Web自动化测试框架Watir(基于Ruby) - 第1章 Windows下安装与部署
- 第149天:javascript中this的指向详解
- SASS详解之编译输出的样式
- pycharm设置安装python第三方插件
- html 表单button