Codeforces 1132E(转化+dp)
2024-10-19 11:55:59
要点
- 假设第i个最后总共选的值为ci,不妨把它分成两部分:$$c_i=cnt'_iL+q_i$$$$L=840,\ 0<=q_i<L$$又可以写成:$$c_i=cnt_1i+cnt_2i$$$$cnt_i'=\frac{cnt_1}{\frac{L}{i}},\ q_i=cnt_2i$$所以$$maxcnt'_i=\frac{cnt[i]-cnt_2}{\frac{L}{i}}$$一会dp要用。
- 事实上如果只有一个item的话,L取它的倍数即可;而8个数我们为了将它们合在一起算,所以取一个它们的LCM。这样做的目的是$$ans=L\sum_{i=1}8{cnt'_i}+\sum_{i=1}8{q_i}$$而此时$$0<=q_i<=8L$$这个值并不大,我们就可以dp做了。
- 设dp[i][j]:在前i个数中取、全部的qi为j时,最多的cnt'。这样最后就既有qi又有cnt',可以直接算出答案。
- 精简dfs做的大佬tql,学不来学不来……
const int N = 9;
const int L = 840;
ll W, cnt[N], dp[N][L * N];
int main() {
ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> W;
rep(i, 1, 8) cin >> cnt[i];
memset(dp, -1, sizeof dp);
dp[0][0] = 0;
rep(fakei, 0, 7) {
rep(j, 0, L * fakei) {
if (dp[fakei][j] >= 0) {
int i = fakei + 1;
rep(k, 0, min(cnt[i], (ll)(L / i))) {
dp[i][j + k * i] = max(dp[i][j + k * i], dp[fakei][j] + (cnt[i] - k) / (L / i));
}
}
}
}
ll ans = 0;
rep(j, 0, L * 8) {
if (j > W) break;
if (dp[8][j] >= 0) {
ans = max(ans, min(dp[8][j], (W - j) / L) * L + j);
}
}
cout << ans << endl;
return 0;
}
最新文章
- 如何在个人博客引擎 Hexo 中添加 Swiftype 搜索组件
- 【java基础学习二】 数组相互转换,转成用逗号隔开的字符串等
- javascript-binarySearch
- error while loading shared libraries: libXXX.so.x: cannot open shared object file: No such file or directory .
- Prime Factory
- 或许您还不知道的八款Android开源游戏引擎
- ios开发之网络数据的下载与上传
- oracle tns in linux
- 简单模拟java动态动态代理机制的底层实现原理
- word 中Sentences、Paragraph等含义和用法
- win7限制登录时间的设置方法
- window 配置 sendmail
- jQuery对象与DOM对象的互相转换
- nopCommerce 3.3正式发布及新增功能改进
- 在Ubuntu下直接通过SSH登录到OpenWrt
- ORACLE 博客文章目录
- Linux删除隐藏文件
- vue命令行错误处理
- jmeter如何链接数据库并拿到相应值用到请求中
- http标码集合
热门文章
- DHCP request error:Timed out waiting for dhcpcd to start【转】
- Linux - Unix环境高级编程(第三版) 源代码编译(即头文件apue.h如何使用问题)【转】
- codeforces B. Roma and Changing Signs 解题报告
- RAC环境下oracle实例启动问题:ora-01565,ora-17503
- get_extension_funcs 返回某个模块下的所有函数
- C++之构造函数、参数列表、析构函数
- Building Objective-C static libraries with categories(ObjC、all_load、force_load)
- 安装和配置Rose HA
- ceph与openstack对接(cinder、glance、nova)
- CS231n 2016 通关 第三章-SVM 作业分析