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 ...
随机推荐
- Java开发笔记(九十五)NIO配套的文件工具Files
NIO不但引进了高效的文件通道,而且新增了更加好用的文件工具家族,包括路径组工具Paths.路径工具Path.文件组工具Files.先看路径组工具Paths,该工具提供了静态方法get,输入某个文件的 ...
- android AutoCompleteTextView 实现手机号格式化,附带清空历史的操作
有个小伙伴遇到了这样一个问题,就是AutoCompleteTextView实现自动填充的功能.同时要具备手机格式化的功能.下拉列表最后一行是有个清除历史的功能.可是点击“清除历史”却把文字要设置进去A ...
- java实现单向链表的增、删、改、查
单向链表 作者:vashon package com.ywx.link; /** * 单向链表 * @author vashon * */ public class LinkTest { public ...
- Android获取声音长度
代码 MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever(); metaRetriever.setDataSource( ...
- upupw nginx服务器 rewrite设置
最近开始尝试使用upupw的Nginx套件做开发,感觉还挺不错的,也遇到了一些问题,决定在这里记录一下,同时也希望可以帮助到一些人. 用习惯了Apache,改用Nginx之后会有些不适应,但是咬咬牙就 ...
- codevs 1043 方格取数 2000年NOIP全国联赛提高组
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 设有N*N的方格图(N<=10,我们将其中的某些方格中填入正整数,而 ...
- javaee 第七周作业
一.什么是JSON? JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于 ECMAScript (欧洲计算机协会制定的js规范)的一 ...
- 【转】DLL中导出函数的两种方式(dllexport与.def文件)
DLL中导出函数的两种方式(dllexport与.def文件) DLL中导出函数的声明有两种方式: 一种方式是:在函数声明中加上__declspec(dllexport):另外一种方式是:采用模块定义 ...
- Linux-03 Linux下的tar命令
功能说明 用来建立,还原备份文件的工具程序,它可以加入,解开备份文件内的文件 参数 -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五 ...
- ImportError: pycurl: libcurl link-time ssl backend (nss) is different
reference pip uninstall pycurl export PYCURL_SSL_LIBRARY=nss easy_install pycurl