【多重背包小小的优化(。・∀・)ノ゙】BZOJ1531-[POI2005]Bank notes
2024-10-21 09:29:57
【题目大意】
Byteotian Bit Bank (BBB) 拥有一套先进的货币系统,这个系统一共有n种面值的硬币,面值分别为b1, b2,..., bn. 但是每种硬币有数量限制,现在我们想要凑出面值k求最少要用多少个硬币。
【思路】
裸的多重背包能过,不过好像有个神奇的优化?
把c[i]拆分成(1、2、4、……、2^x、余下数)的形式,由于每一次在前一次的基础上进行,可以拼凑初1..c[i]中的任意数。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=+;
const int INF=*+;
int n,val,b[MAXN],c[MAXN];
int f[MAXN];//凑出纸值x的面值数量 int main()
{
scanf("%d",&n);
for (int i=;i<=n;i++) scanf("%d",&b[i]);
for (int i=;i<=n;i++) scanf("%d",&c[i]);
scanf("%d",&val);
f[]=;
for (int i=;i<=val;i++) f[i]=INF;
for (int i=;i<=n;i++)
for (int k=;c[i];k<<=)
{
k=min(k,c[i]);
c[i]-=k;
for (int j=val;j>=k*b[i];j--)
f[j]=min(f[j],f[j-k*b[i]]+k);
}
printf("%d",f[val]);
return ;
}
最新文章
- Java 二叉树遍历右视图-LeetCode199
- 算法数据结构(一)-B树
- 清华学堂 LightHouse
- 使用react做的聊天对话列表
- Ansible学习笔记
- mysql gb2312与lanti1
- transitionend 事件的兼容
- 3月3日(5) Roman to Integer
- bootstrap IE兼容
- C#应用程序隐藏调用bat脚本
- Oracle 数据备份与恢复
- lvs负载均衡概述
- ethereum/EIPs-160 EXP cost increase
- Delphi处理Http请求自定义Header
- 微信小程序中使用Async-await方法异步请求变为同步请求
- python开源数据库gadfly安装排除错误
- dapper 简单多表查询
- 转: jquery.qrcode.js生成二维码插件&;转成图片格式
- SCRUM站立会议模拟
- Java并发编程之重入锁
热门文章
- ASP.NET EF(LINQ/Lambda查询)
- Anaconda3的安装和汉化
- 64_n1
- str.format() 格式化字符串函数
- JavaScript基础练习(一)
- git rebase 过程中遇到冲突该怎么解决?
- 写在Web考试后的一点小总结
- 仿微信小红圈消息提示App消息红圆点提示
- Python2中input()、raw_input()和Python3中input()
- Asp.net MVC CSS/Javascript Bundle 配置文件