bzoj 1531: [POI2005]Bank notes 单调队列优化多重背包
来源:互联网 发布:php 互换数组里面的值 编辑:程序博客网 时间:2024/05/01 05:32
题目
Description
Byteotian Bit Bank (BBB) 拥有一套先进的货币系统,这个系统一共有n种面值的硬币,面值分别为b1, b2,…, bn. 但是每种硬币有数量限制,现在我们想要凑出面值k求最少要用多少个硬币.
Input
第一行一个数 n, 1 <= n <= 200. 接下来一行 n 个整数b1, b2,…, bn, 1 <= b1 < b2 < … < b n <= 20 000, 第三行 n 个整数c1, c2,…, cn, 1 <= ci <= 20 000, 表示每种硬币的个数.最后一行一个数k – 表示要凑的面值数量, 1 <= k <= 20 000.
Output
第一行一个数表示最少需要付的硬币数
Sample Input
3
2 3 5
2 2 1
10
Sample Output
3
分析
神牛:一大早又虐了一道水题。
我:一大晚的还被水题虐。
裸的单调队列维护多重背包,但因为好久没写了,所以就调了有一段时间。就当是复习模板了。
代码
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#define N 205#define M 20005#define inf 0x3f3f3f3fusing namespace std;int b[N],c[N],f[M],q[M],w[M];int main(){ int n,m; scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%d",&b[i]); for (int i=1;i<=n;i++) scanf("%d",&c[i]); scanf("%d",&m); memset(f,inf,sizeof(f)); f[0]=0; for (int i=1;i<=n;i++) { for (int j=0;j<b[i];j++) { int head=1,tail=0; for (int k=j;k<=m;k+=b[i]) { while (head<=tail&&w[head]<k-c[i]*b[i]) head++; while (head<=tail&&f[k]-(k-w[head])/b[i]<=q[tail]) tail--; q[++tail]=f[k]; w[tail]=k; f[k]=min(f[k],q[head]+(k-w[head])/b[i]); } } } printf("%d",f[m]); return 0;}
0 0
- bzoj 1531: [POI2005]Bank notes 单调队列优化多重背包
- BZOJ 1531 POI2005 Bank notes 多重背包
- BZOJ 1531: [POI2005]Bank notes 多重背包
- 【BZOJ1531】[POI2005]Bank notes【多重背包】
- bzoj1531[POI2005]Bank notes 多重背包
- 【BZOJ 1531】 [POI2005]Bank notes
- bzoj 1531: [POI2005]Bank notes
- 【BZOJ】【P1531】【POI2005】【Bank notes】【题解】【二进制优化背包】【300T留念】
- 多重背包单调队列优化
- 单调队列优化多重背包
- 单调队列优化多重背包
- 单调队列优化多重背包
- 多重背包,二进制优化,单调队列优化
- hdu2191多重背包单调队列优化
- Dividing(多重背包、单调队列优化dp)
- 多重背包(单调队列优化)
- poj1742 单调队列优化多重背包
- 单调队列优化的多重背包
- CodeForces 205B
- IT知识图谱(只是从CSDN中把图片,一个个下载了)
- 洛谷 2115
- KafKa数据存储与数据一致性保证
- Java回顾之I/O
- bzoj 1531: [POI2005]Bank notes 单调队列优化多重背包
- 删除vector中内存
- 数据库基础
- 大型网站架构技能图谱-Java版
- 【Linux】mount命令介绍及其使用
- Android中的多媒体音频和视频播放
- HDU 2209 C - 翻纸牌游戏
- Android Camera HAL3中预览preview模式下的控制流
- 十一、SQLite数据库增删改查操作案例