博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DSY1531*Bank notes
阅读量:5080 次
发布时间:2019-06-12

本文共 1478 字,大约阅读时间需要 4 分钟。

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
 
多重背包,转化为01背包做,但是需要加上二进制优化,不然会超时。
1 #include
2 #include
3 #include
4 #include
5 using namespace std; 6 int f[22222]={
0},b[222]={
0},c[222]={
0},s[4000005]={
0},w[4000005]={
0}; 7 8 int main() 9 {10 int n=0;11 cin>>n;12 for (int i=1;i<=n;i++)13 cin>>b[i];14 for (int i=1;i<=n;i++)15 cin>>c[i];16 int tot=0;17 int now=1,x=0;18 while (now<=n)19 {20 x=1;21 while (c[now]-x>0)22 {23 ++tot;24 s[tot]=x*b[now];25 w[tot]=x;26 c[now]-=x;27 x=x*2;28 }29 if (c[now]>0)30 {31 ++tot;32 s[tot]=c[now]*b[now];33 w[tot]=c[now];34 }35 ++now;36 }37 int k=0;38 memset(f,10000,sizeof(f));39 cin>>k;40 f[0]=0;41 for (int i=1;i<=tot;i++)42 for (int j=k;j>=s[i];j--)43 f[j]=min(f[j-s[i]]+w[i],f[j]);44 cout<

 

转载于:https://www.cnblogs.com/Maxxzy/p/6225092.html

你可能感兴趣的文章
BZOJ 1047 HAOI2007 理想的正方形 单调队列
查看>>
各种语言推断是否是手机设备
查看>>
这个看起来有点简单!--------实验吧
查看>>
PHP count down
查看>>
JVM参数调优:Eclipse启动实践
查看>>
(旧笔记搬家)struts.xml中单独页面跳转的配置
查看>>
不定期周末福利:数据结构与算法学习书单
查看>>
strlen函数
查看>>
python的列表与shell的数组
查看>>
关于TFS2010使用常见问题
查看>>
软件工程团队作业3
查看>>
python标准库——queue模块 的queue类(单向队列)
查看>>
火狐、谷歌、IE关于document.body.scrollTop和document.documentElement.scrollTop 以及值为0的问题...
查看>>
深入理解JVM读书笔记--字节码执行引擎
查看>>
vue-搜索功能-实时监听搜索框的输入,N毫秒请求一次数据
查看>>
批处理 windows 服务的安装与卸载
查看>>
React文档翻译 (快速入门)
查看>>
nodejs fs路径
查看>>
动态规划算法之最大子段和
查看>>
linux c:关联变量的双for循环
查看>>