\(\\\)

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;
}

最新文章

  1. 递归实现n(经典的8皇后问题)皇后的问题
  2. Winform(DataGridView)控件及通过此控件中实现增删改查
  3. ios第二天{函数}
  4. third class
  5. 原 ng-include用法分析以及多标签页面的简单实现方式
  6. css初始化样例代码
  7. 玩耍Hibernate系列(二)--基础知识
  8. samba linux windows 请联系管理员
  9. Android解析XML
  10. MongoDB复制集之将现有的单节点服务器转换为复制集
  11. SVG如何做圆形图片
  12. java-web中生成文档(一)
  13. SecureCRT设置linux终端显示颜色
  14. Magicodes.WeiChat——V3.0(多租户)版本发布
  15. mecacheq的配置
  16. kbmmw 5.07 正式发布
  17. ACM竞赛之输入输出(以C与C++为例)
  18. Android 禁止系统进入深度休眠
  19. Android logcat输出中文乱码
  20. Vs2012 编写代码规则

热门文章

  1. 选择判断语句(switch)
  2. operamasks-omGrid的使用
  3. 立面图 平面图 剖面图 CAD
  4. UML图与机房收费系统实例
  5. react 项目实战(五)渲染用户列表
  6. 《从零開始学Swift》学习笔记(Day67)——Cocoa Touch设计模式及应用之MVC模式
  7. hdu 3006 The Number of set(思维+壮压DP)
  8. [Python] How to unpack and pack collection in Python?
  9. npm won&#39;t install packages “npm ERR! network tunneling socket could not be established, cause=Parse Error”
  10. 一些Razor语法