题意:

有\(10\)种面值为\(1, 5, 10, 20, 50, 100, 200, 500, 1000, 2000\)的纸币,现在你要选最多的数量凑成\(p\)块钱。

分析:

同样分析问题的反面:设总金额为\(sum\),我们来求凑成\(sum-p\)所需要的最少的张数。那么剩下的就是凑成\(p\)的最多的张数。

如果没有\(50\)和\(500\)的面值的话,那么后一种面值都是前一种面值的倍数,显然贪心是可以的。

贪心的理由就是完全可以用大面值替换掉对应数量的小面值的钱,这样总钱数不变但张数变少了。

考虑到\(50\)和\(500\)的存在,就会出现用大面值凑不成但用小面值能凑成的情况。

所以可以枚举\(50\)和\(500\)分别用了奇数张还是偶数张,然后剩下的\(50\)和\(500\)两张两张地取。

或者看成面值为\(100\)和\(1000\)的对答案贡献为2的纸币。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int INF = 0x3f3f3f3f; int n, a[10], b[10];
int val[] = { 1, 5, 10, 20, 50, 100, 200, 500, 1000, 2000 }; int sum, tot, ans; //用最少张数的钱去凑n块钱
int solve(int n) {
int ans = 0;
for(int i = 9; i >= 0; i--) {
if(i == 4 || i == 7) { //50和500两张两张地取
int t = min(n / (val[i] * 2), b[i] / 2);
ans += t * 2;
n -= val[i] * 2 * t;
}
else {
int t = min(n / val[i], b[i]);
ans += t;
n -= t * val[i];
}
if(n == 0) break;
}
if(n > 0) return INF;
else return ans;
} //#define DEBUG int main()
{
int T; scanf("%d", &T);
while(T--) {
scanf("%d", &n);
sum = 0, tot = 0;
for(int i = 0; i < 10; i++) {
scanf("%d", a + i);
tot += a[i];
sum += val[i] * a[i];
} if(sum < n) { printf("-1\n"); continue; } #ifdef DEBUG
printf("sum = %d, tot = %d, cou = %d\n", sum, tot, sum - n);
#endif n = sum - n;
ans = INF;
for(int i = 0; i < 2; i++)
for(int j = 0; j < 2; j++) { //枚举50和500分别取了奇数个还是偶数个
memcpy(b, a, sizeof(a));
int t = n;
if(i) {
if(b[4]) { t -= 50; b[4]--;}
else continue;
}
if(j) {
if(b[7]) { t -= 500; b[7]--; }
else continue;
}
if(t >= 0) ans = min(ans, solve(t) + i + j);
} if(ans == INF) printf("-1\n");
else printf("%d\n", tot - ans);
} return 0;
}

HDU 5527 Too Rich 贪心的更多相关文章

  1. 【算法系列学习】HDU 5527 Too Rich贪心

    http://www.cnblogs.com/AOQNRMGYXLMV/p/4934747.html #include<iostream> #include<cstdio> # ...

  2. HDU 5527 Too Rich ( 15长春区域赛 A 、可贪心的凑硬币问题 )

    题目链接 题意 : 给出一些固定面值的硬币的数量.再给你一个总金额.问你最多能用多少硬币来刚好凑够这个金额.硬币数量和总金额都很大   分析 : 长春赛区的金牌题目 一开始认为除了做类似背包DP那样子 ...

  3. HDU 5527 Too Rich

    Too Rich Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  4. 2015ACM/ICPC亚洲区长春站 A hdu 5527 Too Rich

    Too Rich Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  5. HDU 4442 Physical Examination(贪心)

    HDU 4442 Physical Examination(贪心) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=4442 Descripti ...

  6. Too Rich HDU - 5527 (贪心+dfs)

    Too Rich Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  7. HDU 5527:Too Rich(DFS+贪心)***

    题目链接 题意 给出p块钱,现在要用十种硬币凑出,每种硬币有c[i]个,问最多能用多少个硬币. 思路 首先确定,对于每个硬币就是能用小的替换就不用大的. 所以,可以先把硬币尽量用小的替换,如果小的不够 ...

  8. HDU 5527 贪心

    Too Rich Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  9. HDU 5835 Danganronpa (贪心)

    Danganronpa 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5835 Description Chisa Yukizome works as ...

随机推荐

  1. 基本类型包装类、System类、Math类、Arrays类、大数据运算

    1 基本类型包装类 Java中想对8种基本数据类型进行复杂操作很困难. 实际程序界面上用户输入的数据都是以字符串类型进行存储的. 程序开发中,需要把字符串转换成指定的基本数据类型. 1.1基本数据类型 ...

  2. css设置文字超出部分显示省略号。。。

    兼容IE/Firefox/Chrome display:block; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;

  3. Kendo UI 特效概述

    Kendo UI 特效概述 Kendo UI Fx 提供了一个丰富,可扩展,性能经过优化的工具集合用来完成 HTML 元素的过渡显示.每种特效近可能的使用 CSS Transition ,对于一些老版 ...

  4. The great pleasure in life is doing what people say you cannot do.

    The great pleasure in life is doing what people say you cannot do.  人生最大的快乐是做到别人认为你做不到的事情.

  5. Redis数据库1

    一.启动服务 #进入redis安装文件夹 cd /usr/local/redis/ #开启服务端(后端开启) ./bin/redis-server ./redis.conf #开启客户端 ./bin/ ...

  6. Android的bitmap和优化

    内存管理是个永恒的话题! 内存溢出:就是分配的内存不足以放下数据项序列.如在一个域中输入的数据超过了它的要求就会引发数据溢出问题,多余的数据就可以作为指令在计算机上运行.就是你要求分配的内存超出了系统 ...

  7. bug {was not declared in this scope}

    使用自己定义的结构体作为返回值的时候,出现了 ...was not declared in this scope 检查了各种头文件,把缓存也都删掉了还是不行. 结果,发现,应该这样用vector< ...

  8. nginx只允许域名访问网址,禁止ip访问

    修改nginx配置 文件 在server段里插入如下正则: if ( $host != 'www.baidu.com') { return 403; } 说明:如果访问讨还不是www.baidu.co ...

  9. C++11 function用法 可调用对象模板类

    std::function<datatype()> ()内写参数类型 datatype 代表function的返回值 灵活的用法.. 代码如下 #include <stdio.h&g ...

  10. Ubuntu 16.04 换国内源

    官方渠道,图形界面,操作简单,可以说对新手及其友好!! 依次打开:搜索,软件与更新,第一个和第三个勾上,下载自,其它,然后在中国条目下选择你想使用的镜像站点,然后点“选择服务器”,然乎点击“关闭”,选 ...