1716: [Usaco2006 Dec]The Fewest Coins 找零钱
n<=100种硬币,给每种的硬币的面额<=120和我每种有多少个<=10000,店主的硬币跟我一样但有无限个,求买t<=10000块钱的东西钱最少转手几次。
我拿的硬币最少几次就是多重背包,店主还的最少当然是完全背包啦,那问题在于这个背包多大呀?
找回来的钱和我给的钱一定没有交集,如果有,那当初少给点就好了。我们需要找钱,究其原因是要用给的钱若干减去找的钱若干凑到t。那么极端地,要凑t%vmax*2次才能凑到和t在%vmax同个值的数。而这意味着我们要多出最多vmax^2块钱。
看不懂就对了!代码在下面,要严谨去看看其他大爷的博客吧!
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
//#include<iostream>
using namespace std; int n,m,t;
#define maxn 111
#define maxm 25011
int f[maxm],g[maxm],v[maxn],c[maxn];
int que[maxm],head,tail,id[maxm],vmax;
const int inf=0x3f3f3f3f;
int main()
{
scanf("%d%d",&n,&t);vmax=;
for (int i=;i<=n;i++) scanf("%d",&v[i]),vmax=max(vmax,v[i]);
for (int i=;i<=n;i++) scanf("%d",&c[i]);
int m=t+vmax*vmax;
f[]=g[]=;for (int i=;i<=m;i++) f[i]=g[i]=inf;
for (int i=;i<=n;i++)
for (int j=;j<v[i];j++)
{
head=tail=;
for (int k=,now;(now=k*v[i]+j)<=m;k++)
{
int tmp=f[now]-k;
while (head<tail && que[tail-]>tmp) tail--;
while (head<tail && id[head]<k-c[i]) head++;
que[tail]=tmp;id[tail++]=k;
f[now]=min(inf,que[head]+k);
}
}
for (int i=;i<=n;i++)
for (int j=;j<v[i];j++)
{
int Min=inf;
for (int k=j;k<=m;k+=v[i])
{
Min=min(Min,g[k]-k/v[i]);
g[k]=Min+k/v[i];
}
}
int ans=inf;
for (int i=t;i<=m;i++) ans=min(ans,f[i]+g[i-t]);
printf("%d\n",ans==inf?-:ans);
return ;
}
1716: [Usaco2006 Dec]The Fewest Coins 找零钱的更多相关文章
- BZOJ 1649: [Usaco2006 Dec]Cow Roller Coaster( dp )
有点类似背包 , 就是那样子搞... --------------------------------------------------------------------------------- ...
- 1715: [Usaco2006 Dec]Wormholes 虫洞
1715: [Usaco2006 Dec]Wormholes 虫洞 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 501 Solved: 278[Sub ...
- BZOJ#1717:[Usaco2006 Dec]Milk Patterns 产奶的模式(后缀数组+单调队列)
1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 Description 农夫John发现他的奶牛产奶的质量一直在变动.经过细致的调查,他发现:虽然他不能预见明天产奶的 ...
- 动态规划--找零钱 coin change
来自http://www.geeksforgeeks.org/dynamic-programming-set-7-coin-change/ 对于整数N,找出N的所有零钱的表示.零钱可以用S={s1,s ...
- The Fewest Coins POJ - 3260
The Fewest Coins POJ - 3260 完全背包+多重背包.基本思路是先通过背包分开求出"付出"指定数量钱和"找"指定数量钱时用的硬币数量最小值 ...
- POJ 3260 The Fewest Coins(多重背包+全然背包)
POJ 3260 The Fewest Coins(多重背包+全然背包) http://poj.org/problem?id=3260 题意: John要去买价值为m的商品. 如今的货币系统有n种货币 ...
- [LeetCode] 由 “找零钱" 所想
Ref: [Optimization] Dynamic programming[寻找子问题] Ref: [Optimization] Advanced Dynamic programming[优于re ...
- POJ 3260 The Fewest Coins(完全背包+多重背包=混合背包)
题目代号:POJ 3260 题目链接:http://poj.org/problem?id=3260 The Fewest Coins Time Limit: 2000MS Memory Limit: ...
- 后台开发 3个题目 array_chunk, 100块钱找零钱(动态规划 dynamic programming), 双向循环链表 llist 删除节点
1. array_chunk 实现 http://php.net/manual/en/function.array-chunk.php <?php function my_array_chunk ...
随机推荐
- 使用NPOI操作Excel文件及其日期处理
工作中经常遇到需要读取或导出Excel文件的情况,而NPOI是目前最宜用.效率最高的操作的Office(不只是Excel哟)文件的组件,使用方便,不详细说明了. Excel工作表约定:整个Excel表 ...
- ZigBee cc2530芯片学习 error记录(1)
ZigBee cc2530芯片学习 error记录 Error[e46]: Undefined external "LcdInit" referred in main( xxx ...
- 洛谷 P1955 程序自动分析
题目描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3...代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变 ...
- 原创 :单刷深渊 在Linux中系统安装mysql实战直播
[root@web108 tools]# ###开始装mysql 1添加用户 [root@web108 tools]# useradd -s /sbin/nologin -M mysql 2解压 [r ...
- Linux/Windows 实用工具简记
以下只是开发中可能用的比较多的工具,另外还有其他很多未曾提及的实用工具.Linux篇: 1.链接过程的调试:主要用于查看构建过程:如链接时加载的动态库以及运行时加载动态库过程的调试 支持LD_DEBU ...
- mysql 函数tree状
// 子节点的查询 CREATE DEFINER = `root`@`%` FUNCTION `getDeptChildList`(rootId BIGINT) RETURNS longtext DE ...
- ElasticSearch的常用方法
关键词 cluster 集群 shards 索引分片 replicas 索引的副本 recovery 数据重新分布 gateway 索引的持久化方式 Transport 交互 ...
- Oracle————存储过程与函数
存储过程存储过程参数模式包括IN.OUT. IN OUT. IN(默认参数模式):表示当存储过程别调用时,实参值被传递给形参:形参起变量作用,只能读该参数,而不能修改该参数.IN模式参数可以是变量或表 ...
- dockerfile note
dockerfile note reference summary defination docker can build images automatically by reading the in ...
- 【干货分享】C# 实体类生成工具
前言: 项目实战中不论是业务编码还是通用编码,总会归纳出一些通用的工具类.放入项目中一劳永逸,让兄弟姐妹们避免编写重复代码.所以利用了工作之余的时间,将这些散落在多个项目中精致优雅的工具类,归纳起来形 ...