[ POI 2005 ] Bank Notes
\(\\\)
Description
给出 \(N\) 种货币的面值 \(b_i\) 和个数 \(c_i\) ,求最少需要用多少个硬币凑出 \(Q\) 元钱,并输出任意一种方案。
- \(n\le 200,Q,b_i ,c_i\le 2\times 10^4,\) 空间限制 64 M。
\(\\\)
Solution
空间计算不讲道理
如果不输出方案的话,就是一个普通的多重背包了对吧。
\(f[i]\) 表示达到体积为 \(i\) 的最少硬币数,然后直接二进制拆分就好了。
考虑转移的时候记录 \(pre\) 。
按照一般的动规方式,我们需要记录某一个状态转移自哪一个状态,这一题种,我们只需要记录转移自的上一个体积即可,若未转移指向自己。
但是发现空间爆炸。
分析转移性质,每次做背包的物品大小固定,所以转移自的状态也是确定的,所以我们只需要用一个 $bool $ 数组记录当前位置是否转移过即可。
但是依旧不明白为什么这样空间开的下 手算大小在 114 M左右
\(\\\)
Code
#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 20010
#define R register
#define gc getchar
using namespace std;
inline int rd(){
int x=0; bool f=0; char c=gc();
while(!isdigit(c)){if(c=='-')f=1;c=gc();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();}
return f?-x:x;
}
bool g[3000][N];
int n,k,tot,b[210],c[210],f[N],bin[30]={1},cnt[210];
struct obj{int v,w,p;}s[3000];
inline void calc(int v,int w){
for(R int i=k;i>=v;--i)
if(f[i]>f[i-v]+w) g[tot][i]=1,f[i]=f[i-v]+w;
}
inline void add(int v,int w,int ty){
s[++tot].v=v; s[tot].w=w;
s[tot].p=ty; calc(v,w);
}
void dfs(int v,int t){
if(v==0) return;
while(!g[t][v]) --t;
cnt[s[t].p]+=s[t].w;
dfs(v-s[t].v,t-1);
}
int main(){
n=rd();
memset(f,0x3f,sizeof(f)); f[0]=0;
for(R int i=1;i<=30;++i) bin[i]=(bin[i-1]<<1);
for(R int i=1;i<=n;++i) b[i]=rd();
for(R int i=1;i<=n;++i) c[i]=rd();
k=rd();
for(R int i=1;i<=n;++i){
for(R int j=0;j<=30;++j){
if(c[i]<bin[j]) break;
c[i]-=bin[j];
add(bin[j]*b[i],bin[j],i);
}
if(c[i]) add(c[i]*b[i],c[i],i);
}
printf("%d\n",f[k]);
dfs(k,tot);
for(R int i=1;i<=n;++i) printf("%d ",cnt[i]);
return 0;
}
[ POI 2005 ] Bank Notes的更多相关文章
- BZOJ 1531: [POI2005]Bank notes( 背包 )
多重背包... ---------------------------------------------------------------------------- #include<bit ...
- 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. 但是每种硬币有数量限制,现在我 ...
- DSY1531*Bank notes
Description Byteotian Bit Bank (BBB) 拥有一套先进的货币系统,这个系统一共有n种面值的硬币,面值分别为b1, b2,..., bn. 但是每种硬币有数量限制,现在我 ...
- 1531: [POI2005]Bank notes二进制优化(c++)
Description Byteotian Bit Bank (BBB) 拥有一套先进的货币系统,这个系统一共有n种面值的硬币,面值分别为b1, b2,..., bn. 但是每种硬币有数量限制,现在我 ...
- 【多重背包小小的优化(。・∀・)ノ゙】BZOJ1531-[POI2005]Bank notes
[题目大意] Byteotian Bit Bank (BBB) 拥有一套先进的货币系统,这个系统一共有n种面值的硬币,面值分别为b1, b2,..., bn. 但是每种硬币有数量限制,现在我们想要凑出 ...
- 【bzoj1531】[POI2005]Bank notes 多重背包dp
题目描述 Byteotian Bit Bank (BBB) 拥有一套先进的货币系统,这个系统一共有n种面值的硬币,面值分别为b1, b2,..., bn. 但是每种硬币有数量限制,现在我们想要凑出面值 ...
- ●BZOJ 1531 [POI2005]Bank notes
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1531 题解: 单调队列优化多重背包DP (弱弱的我今天总算是把这个坑给填了...) 令V[i ...
随机推荐
- 04-js的运算符
<html> <head> <title>js的运算符学习</title> <meta charset="UTF-8"/> ...
- 应用CLR的线程池
大家都知道这个线程的建立和销毁都需要很大的性能开销,当有比较多且不同的任务需要完成时,可以考虑使用线程池来管理这些线程.在以windows NT为内核的操作系统上每个进程都包含一个线程池,在线程池中存 ...
- dubbo安装和使用
转载:http://blog.csdn.net/zjcjava/article/details/78766095 背景 Dubbo的开源人梁飞在内部的交流会上宣布重启dubbo的维护和更新,具体PPT ...
- 原想着mysql里放些文件什么的,查完资料还是算了
三种东西永远不要放到数据库里 1.图片,文件,二进制数据,文件还是放入文件服务器吧或者分布式文件系统 2.短生命期数据 3.日志文件 mysql中一张表的数据是全部在一个数据文件中的.如果大字段的数据 ...
- node安装-Win+Linux+Mac osx
node下载地址,除了Mac osx或Win平台,仅有Linux平台命令安装. Win.Mac 点击即可下载(注:Mac有dmg和pkg安装格式). Linux分为Redhot和Deepin系列,安装 ...
- jmeter获取时间_time 函数
原始时间戳13位精确到毫秒:${__time(,)} 时间戳精确到秒10位:${__time(/1000,)} 时间日期到年月日2019-04-21:${__time(yyyy-MM-dd,)} 时间 ...
- servlet container:tomcat jetty and undertow
1 spring boot内嵌容器支持tomcat.jetty和undertow 但是undertow性能最好,详见: https://examples.javacodegeeks.com/enter ...
- Chapter 4 Syntax Analysis
Chapter 4 Syntax Analysis This chapter is devoted to parsing methods that are typically used in comp ...
- Code First:Fluent API
DbContext类有一个OnModelCreating方法,可以在这里配置模型,该方法接收一个类型为DbModelBuilder的建造者,本文介绍的为Data Anotation的等价方法,这些代码 ...
- ModuleNotFoundError: No module named 'cStringIO'
这是2.x转3.x问题: 2.x写法: import cStringIO 3.x写法: from io import StringIO 问题解决.