题意:

有\(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. vuex填坑记录

    vuex是需要等待页面加载完成后才会更新的,如果页面点击刷新有用到vuex的地方,那么vuex会保持旧的数据,等刷新完成后vuex的数据才会重置,所以要在页面加载后再调用vuex的数据才是正确的,如果 ...

  2. JavaScript中登录名的正则表达式及解析(0基础)

    简言 在JavaScript中,经常会用到正则表达式来进行模式匹配.例如,登录名验证,密码强度验证,字符串查找或替换等操作.现在就开始吧,零基础写出你的第一个正则表达式! 在做用户注册时,都会用到登录 ...

  3. U3D加载服务器上的assetbundle

    在Unity3D中,如果加载服务器上的AssetBundle,总是会提示找不到crossdomain.xml文件,即使添加了该文件,也会报同样的错误.属于跨域访问报错的问题. 官方的解决方案如下: h ...

  4. oracle 、server和my sql 语法区别

    1.总结Oracle .sqlserver和mysql中查询10-20条记录的写法 一: oracle数据库写法: 1:select * from (select rownum rn ,* from ...

  5. 洛谷 P1057 传球游戏

    题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同 ...

  6. 如何在SAP云平台的Cloud Foundry环境下添加新的Service(服务)

    我想在SAP云平台的Cloud Foundry环境下使用MongoDB的服务,但是我在Service Marketplace上找不到这个服务. cf marketplace返回的结果也没有. 解决方案 ...

  7. Netbackup8.0以上版本,服务端生成证书,客户端获取、更新证书方式(整理中)

    创建重发令牌 如果非主控主机已在主服务器上注册但其基于主机ID的证书不再有效,则可以重新颁发基于主机ID的证书.例如,证书在过期,被撤销或丢失时无效. 重发令牌是一种可用于重新颁发证书的令牌.它是一种 ...

  8. Mycat实现读写分离、分库分表

    系统开发中,数据库是非常重要的一个点.除了程序的本身的优化,如:SQL语句优化.代码优化,数据库的处理本身优化也是非常重要的.主从.热备.分表分库等都是系统发展迟早会遇到的技术问题问题.Mycat是一 ...

  9. Python-OpenCV——Image inverting

    通常我们将读入的彩色图转化成灰度图,需要将灰度图反转得到掩码,如何正确快速的得到某个图像的反转图呢? 首先看一种看似很正确的写法,对其中每个像素进行如下处理: img[x,y] = abs(img[x ...

  10. 在ProgressBar控件中显示进度百分比

    实现效果: 知识运用: ProgressBar控件的Value属性 //控件的当前值 Maximum属性 //ProgressBar正在使用的范围的上限 PerformStep方法 //按照Step属 ...