●BZOJ 1531 [POI2005]Bank notes
题链:
http://www.lydsy.com/JudgeOnline/problem.php?id=1531
题解:
单调队列优化多重背包DP
(弱弱的我今天总算是把这个坑给填了。。。)
令V[i]为第i种硬币的面值,C[i]为第i种硬币的数目。
定义DP[i][j]表示用了前i种硬币,凑出面值为j的最小硬币数。
先看看这个题用最裸的背包是如何转移的:
DP[i][j]=min(dp[i-1][j-k*V[i]]]+k)
然后,我们令 a=⌊j÷V[i]⌋ (⌊ ⌋:向下取整),b=j%V[i]
那么 j=a*V[i]+b
接下来这样考虑,对于一个当前计算的总面值j,
同样枚举k,但不再像之前那样表示选择了几个i号硬币,
而是表示相对于a而言,少选几个i号硬币。
换句话说,我们对于当前的j,在默认要选a个i号硬币基础上,去枚举少选k个该硬币。
那么怎样转移呢:
DP[i][j]=min(dp[i-1][b+K*V[i]]+a-k)
其实意思还是很明了的,就是选了 a-k 个i号硬币嘛。(好好理解一下)
然后可以把取小项里面的a提出来:
DP[i][j]=min(dp[i-1][b+K*V[i]]-k)+a
再看看这个式子,如果固定i和b,取小项里面就只有K是变化的,
把其看成是一个只与k有关的函数,
显然就可以用单调队列维护最小值然后O(1)转移啦。
具体做法是:
第一层循环先枚举硬币i,
第二层循环再枚举一个b值,
第三层循环接着枚举j,需要满足j=b+a*V[i]
然后第三层循环里面的转移就可以用单调队列维护了,
总的复杂度为 O(N*M)
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 205
#define MAXM 20005
using namespace std;
int V[MAXN],C[MAXN],DP[MAXN][MAXM];
int N,M;
int main(){
static int QK[MAXM],l,r;
scanf("%d",&N);
for(int i=1;i<=N;i++) scanf("%d",&V[i]);
for(int i=1;i<=N;i++) scanf("%d",&C[i]);
memset(DP,0x3f,sizeof(DP));
scanf("%d",&M);
DP[0][0]=0;
for(int i=1;i<=N;i++){
for(int b=0,a;b<V[i];b++){
l=1; r=0;
for(int j=b;a=j/V[i],j<=M;j+=V[i]){
while(l<=r&&DP[i-1][b+QK[r]*V[i]]-QK[r]>=DP[i-1][b+a*V[i]]-a) r--;
QK[++r]=a;
while(l<=r&&a-QK[l]>C[i]) l++;
DP[i][j]=DP[i-1][b+QK[l]*V[i]]-QK[l]+a;
}
}
}
printf("%d",DP[N][M]);
return 0;
}
●BZOJ 1531 [POI2005]Bank notes的更多相关文章
- BZOJ 1531: [POI2005]Bank notes( 背包 )
多重背包... ---------------------------------------------------------------------------- #include<bit ...
- BZOJ 1531: [POI2005]Bank notes
按余数分类 单调队列优化 #include<cstdio> using namespace std; int n,m,b[205],c[205],F[20005]; struct node ...
- 1531: [POI2005]Bank notes二进制优化(c++)
Description Byteotian Bit Bank (BBB) 拥有一套先进的货币系统,这个系统一共有n种面值的硬币,面值分别为b1, b2,..., bn. 但是每种硬币有数量限制,现在我 ...
- bzoj1531[POI2005]Bank notes 单调队列优化dp
1531: [POI2005]Bank notes Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 559 Solved: 310[Submit][Sta ...
- bzoj1531: [POI2005]Bank notes(多重背包)
1531: [POI2005]Bank notes Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 521 Solved: 285[Submit][Sta ...
- bzoj1531: [POI2005]Bank notes
Description Byteotian Bit Bank (BBB) 拥有一套先进的货币系统,这个系统一共有n种面值的硬币,面值分别为b1, b2,..., bn. 但是每种硬币有数量限制,现在我 ...
- 【bzoj1531】[POI2005]Bank notes 多重背包dp
题目描述 Byteotian Bit Bank (BBB) 拥有一套先进的货币系统,这个系统一共有n种面值的硬币,面值分别为b1, b2,..., bn. 但是每种硬币有数量限制,现在我们想要凑出面值 ...
- 2018.09.08 bzoj1531: [POI2005]Bank notes(二进制拆分优化背包)
传送门 显然不能直接写多重背包. 这题可以用二进制拆分/单调队列优化(感觉二进制好写). 所谓二进制优化,就是把1~c[i]拆分成20,21,...2t,c[i]−2t+1+1" role= ...
- [POI2005]Bank notes
link 试题分析 我们发现此题是一个十分简单的多重背包.但是按照朴素写法会超时.所以要去考虑优化. 我们发现我们若$W=7$,可以拆成$1+2+4$,不用每次$1+1+1+1+1+1+1$,从$N$ ...
随机推荐
- Beta冲刺Day7
项目进展 李明皇 今天解决的进度 部分数据传递和使用逻辑测试 林翔 今天解决的进度 服务器端查看个人发布的action,修改已发布消息状态的action,仍在尝试使用第三方云存储功能保存图片 孙敏铭 ...
- bzoj千题计划242:bzoj4034: [HAOI2015]树上操作
http://www.lydsy.com/JudgeOnline/problem.php?id=4034 dfs序,树链剖分 #include<cstdio> #include<io ...
- mui对话框事件
mui.confirm('生成成功,是否跳转到订单页面?','',['跳转','取消'],function(e){ if(e.index==0){ //点击跳转 }else if(e.index==1 ...
- Centos6.7的在虚拟机virulBox下的lamp平台的搭建
实验环境: linux:小甲鱼带你学C语言,带你飞的提供的体积比较小的centos6.7和virtualBox mysql,apahce,php是燕十八在Linux基础进阶中提供的安装方式: 结果,安 ...
- 智能合约语言 Solidity 教程系列9 - 错误处理
这是Solidity教程系列文章第9篇介绍Solidity 错误处理. Solidity系列完整的文章列表请查看分类-Solidity. 写在前面 Solidity 是以太坊智能合约编程语言,阅读本文 ...
- You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'like '%逸%'' at line 1
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-/ ...
- api-gateway实践(03)新服务网关 - 网关请求拦截检查
参考链接:http://www.cnblogs.com/jivi/archive/2013/03/10/2952829.html 一.为什么要拦截检查请求? 防止重放攻击.篡改重放,进行使用规格检查 ...
- OAuth2.0学习(1-4)授权方式1-授权码模式(authorization code)
参与者列表: (1) Third-party application:第三方应用程序,又称客户端(client),如:"云冲印".社交应用. (2)HTTP service:HTT ...
- git常用命令行总结
Git是当今最流行的版本控制工具.这几年GitHub也干掉了GoogleCode和Sourceforge,从三大代码仓库中脱颖而出,除了GitHub自身的优秀外,Git也是功不可没. 为何Git如此出 ...
- 关于阿里巴巴iconfont的使用方法
iconfont网址:http://www.iconfont.cn/ 说起iconfont,做前端开发的应该知道它的好处,图标库之丰富,只有你想不到的,没有你找不到的,而且轻量高清.用户在iconfo ...