usaco 最少找零
Description
约翰在镇上买了 T 元钱的东西,正在研究如何付钱。假设有 N 种钞票,第 i 种钞票的面值为 Vi,约翰身上带着这样的钞票 Ci 张。商店老板罗伯是个土豪,所有种类的钞票都有无限张。他们有洁癖,所以希望在交易的时候,交换的钞票张数尽可能地少。请告诉约翰如何恰好付掉 T 元,而且在过程中交换的货币数量最少。
Input Format
• 第一行:两个整数 N 和 T,1 ≤ N ≤ 100, 1 ≤ T ≤ 10000
• 第二行:n个整数 Vi 第三行:n个整数 Ci,1 ≤ Vi ≤ 120, 0 ≤ Ci ≤ 10000
Output Format
• 单个整数:表示付钱找零过程中交换的最少货币数量,如果约翰的钱不够付账,或老板没法找 开零钱,输出 −1
Sample Input
3 70
5 25 50
5 2 1
Sample Output
3
Hint
约翰付给老板 75 元,老板找约翰 5 元,交换 了 3 张钞票
Source
USACO
读完题目 我们会发现很难用一个动归方程去解决这道问题;
那么我们可以把题目分解成两个问题;
一个是约翰 他的钞票是有限的 那么就把他当作分组背包处理
1 ≤ T ≤ 10000 所以g[i]表示约翰付i元所用的最少钞票
由于0 ≤ Ci ≤ 10000 则时间效率是(TCN);明显会超时;
于是我把分组背包用01背包来做用了二进制优化(logCTN)
当然用贪心去多余的Ci也能用分组背包做;
而二进制优化明显快得多 只用一百多毫秒
然后就是土豪老板了 把他当作完全背包做就好;
f[i]表示老板付i元所用的最少钞票;
然后循环 T~10000;ans=min(ans,F[I]+G[I-T]);
#include<cstdio>
#include<iostream>
using namespace std;
int f[10010],c[1410],w[1410],g[10010];
int i,j,k,l,m,n,ans,T,n1;
int main()
{
//freopen("xx.in","r",stdin);
scanf("%d%d",&n,&T);
for(i=1;i<=n;++i)
scanf("%d",&c[i]);
for(i=1;i<=n;++i)
scanf("%d",&w[i]);
for(i=1;i<=10000;++i)g[i]=f[i]=1e9;
for(i=1;i<=n;++i)
for(j=0;j<=10000-c[i];++j)
f[j+c[i]]=min(f[j+c[i]],f[j]+1);
n1=n;
for(i=1;i<=n;++i)
{
int num=1;
while(w[i]>num)
{
n1++;c[n1]=num*c[i];
w[n1]=num;w[i]-=num;
num*=2;
}
c[i]=w[i]*c[i];
}
for(i=1;i<=n1;++i)
for(j=10000;j>=c[i];--j)
g[j]=min(g[j],g[j-c[i]]+w[i]);
ans=1e9;
for(i=T;i<=10000;++i)
if(g[i])
ans=min(ans,g[i]+f[i-T]);
if(ans==1e9)ans=-1;
printf("%d",ans);
}
usaco 最少找零的更多相关文章
- [BZOJ3312][USACO]不找零(状压DP)
Description 约翰带着 N 头奶牛在超市买东西,现在他们正在排队付钱,排在第 i 个位置的奶牛需要支付 Ci元.今天说好所有东西都是约翰请客的,但直到付账的时候,约翰才意识到自己没带钱,身上 ...
- codevs 3961 硬币找零【完全背包DP/记忆化搜索】
题目描述 Description 在现实生活中,我们经常遇到硬币找零的问题,例如,在发工资时,财务人员就需要计算最少的找零硬币数,以便他们能从银行拿回最少的硬币数,并保证能用这些硬币发工资. 我们应该 ...
- NYOJ 995 硬币找零
硬币找零 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 在现实生活中,我们经常遇到硬币找零的问题,例如,在发工资时,财务人员就需要计算最少的找零硬币数,以便他们能从 ...
- js动态规划---最少硬币找零问题
给定钱币的面值 1.5.10.25 需要找给客户 36 最少找零数为: 1.10.25 function MinCoinChange(coins){ var coins = coins; var ca ...
- usaco No Change, 2013 Nov 不找零(二分查找+状压dp)
Description 约翰带着 N 头奶牛在超市买东西,现在他们正在排队付钱,排在第 i 个位置的奶牛需要支付 Ci 元.今天说好所有东西都是约翰请客的,但直到付账的时候,约翰才意识到自己没带钱,身 ...
- NYOJ995硬币找零(简单dp)
/* 题意:给你不同面额的硬币(每种硬币无限多),需要找零的面值是T,用这些硬币进行找零, 如果T恰好能被找零,输出最少需要的硬币的数目!否则请输出剩下钱数最少的找零方案中的最少硬币数! 思路:转换成 ...
- 【ACM小白成长撸】--贪婪法解硬币找零问题
question:假设有一种货币,它有面值为1分.2分.5分和1角的硬币,最少需要多少个硬币来找出K分钱的零钱.按照贪婪法的思想,需要不断地使用面值最大的硬币.如果找零的值小于最大的硬币值,则尝试第二 ...
- python 回溯法 子集树模板 系列 —— 17、找零问题
问题 有面额10元.5元.2元.1元的硬币,数量分别为3个.5个.7个.12个.现在需要给顾客找零16元,要求硬币的个数最少,应该如何找零?或者指出该问题无解. 分析 元素--状态空间分析大法:四种面 ...
- POJ 1252 Euro Efficiency(完全背包, 找零问题, 二次DP)
Description On January 1st 2002, The Netherlands, and several other European countries abandoned the ...
随机推荐
- 【Oracle】ORA-38171: Insufficient privileges for SQL management object operation
问题: 使用SQL PLAN MANAGEMENT的时候运行下面的存储过程报错. SYS@GOOD> conn scott/tiger Connected. SCOTT@GOOD> DEC ...
- 三维投影总结:数学原理、投影几何、OpenGL教程、我的方法
如果要得到pose视图,除非有精密的测量方法,否则进行大量的样本采集时很耗时耗力的.可以采取一些取巧的方法,正如A Survey on Partial of 3d shapes,描述的,可以利用已得到 ...
- css—文字渐变色
.text-gradient { display: inline-block; color: green; font-size: 10em; font-family: ´微软雅黑´; backgrou ...
- Algorithms算法题<1.1>
1.1.27 二项分布.估计用一下代码计算binomial(100,50,0.25)将会产生的递归调用次数: public static double binomial(int N,int k,dou ...
- 深入理解 Swift 派发机制
原文: Method Dispatch in Swift作者: Brain King译者: kemchenj 译者注: 之前看了很多关于 Swift 派发机制的内容, 但感觉没有一篇能够彻底讲清楚这件 ...
- URLLib库使用
Date: 2019-06-19 Author: Sun urllib 在Python 3以后的版本中,urllib2这个模块已经不单独存在(也就是说当你import urllib2时,系统提示你 ...
- python3发送邮件
import smtplib from email.mime.text import MIMEText from email.utils import formataddr import psutil ...
- pyhton的selenium的搭建
一.好记性不如烂笔头,小伙伴们.让我们做下笔记吧 1.首先要安装pycharm 激活注册码地址:http://idea.lanyus.com/ 2.下载python3.6 python下载地址: ...
- 503是一种HTTP状态码。英文名503 Service Unavailable与404(404 Not Found)是同属一种网页状态出错码。前者是服务器出错的一种返回状态,后者是网页程序没有相关的结果后返回的一种状态,需要优化网站的时候通常需要制作404出错页以便网站整体优化。
goldCat1 商城 消息 | 百度首页 新闻网页贴吧知道音乐图片视频地图百科文库 进入词条搜索词条帮助 近期有不法分子冒充官方收费编辑词条,百度百科严正声明:百科词条人人可编辑,词条创建和修改均免 ...
- 训练1-V
输入2个正整数A,B,求A与B的最大公约数. Input 2个数A,B,中间用空格隔开.(1<= A,B <= 10^9) Output 输出A与B的最大公约数. Sample Input ...