题目链接

题意

给出p块钱,现在要用十种硬币凑出,每种硬币有c[i]个,问最多能用多少个硬币。

思路

首先确定,对于每个硬币就是能用小的替换就不用大的。

所以,可以先把硬币尽量用小的替换,如果小的不够用,再用大的去替换。

根据这个思路,就可以处理出一个前 i 个硬币总价值的前缀和 pre[],从大的面额到小面额去枚举,当前这种面额的硬币至少需要使用 (sum - pre[i-1]) / val[i] 种,sum代表当前还剩下多少钱要去兑换,这个数要向上取整,然后继续dfs下去就可以了。

还有一种情况,就是20和50的情况和200和500的情况,即20不能整除50,那么对于p=60,3个20硬币,1个50硬币这种样例就不能去用这种方法解决了。一个比较好的做法就是让这种硬币多用一个,让它的使用数量变成偶数,就可以被整除了。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
const int INF = 0x3f3f3f3f;
const int N = 15;
int val[] = {0, 1, 5, 10, 20, 50, 100, 200, 500, 1000, 2000};
int c[N], ans, pre[N]; void dfs(int sum, int num, int rem) {
if(sum < 0) return ;
if(rem == 0) {
if(sum == 0) ans = max(ans, num);
return ;
}
int tol = max(sum - pre[rem-1], 0); // 前面的硬币足够的话,就不使用现在的硬币
int cur = (tol + val[rem] - 1) / val[rem]; // 向上取整
if(cur <= c[rem]) dfs(sum - cur * val[rem], num + cur, rem - 1);
cur++; // 当前面整除不了,需要多用一个,变成前面某一个的倍数,例如50和20,500和200
if(cur <= c[rem]) dfs(sum - cur * val[rem], num + cur, rem - 1);
} int main() {
int t; scanf("%d", &t);
while(t--) {
int p; scanf("%d", &p);
pre[0] = 0; ans = -1;
for(int i = 1; i <= 10; i++)
scanf("%d", &c[i]), pre[i] = pre[i-1] + c[i] * val[i];
dfs(p, 0, 10);
printf("%d\n", ans);
}
return 0;
}

HDU 5527:Too Rich(DFS+贪心)***的更多相关文章

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

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

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

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

  3. HDU 5527 Too Rich 贪心

    题意: 有\(10\)种面值为\(1, 5, 10, 20, 50, 100, 200, 500, 1000, 2000\)的纸币,现在你要选最多的数量凑成\(p\)块钱. 分析: 同样分析问题的反面 ...

  4. HDU 5527 Too Rich

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

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

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

  6. hdu 4825 Xor Sum(trie+贪心)

    hdu 4825 Xor Sum(trie+贪心) 刚刚补了前天的CF的D题再做这题感觉轻松了许多.简直一个模子啊...跑树上异或x最大值.贪心地让某位的值与x对应位的值不同即可. #include ...

  7. HDOJ(HDU).2660 Accepted Necklace (DFS)

    HDOJ(HDU).2660 Accepted Necklace (DFS) 点我挑战题目 题意分析 给出一些石头,这些石头都有自身的价值和重量.现在要求从这些石头中选K个石头,求出重量不超过W的这些 ...

  8. HDOJ(HDU).1045 Fire Net (DFS)

    HDOJ(HDU).1045 Fire Net [从零开始DFS(7)] 点我挑战题目 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双重DFS HD ...

  9. HDOJ(HDU).1241 Oil Deposits(DFS)

    HDOJ(HDU).1241 Oil Deposits(DFS) [从零开始DFS(5)] 点我挑战题目 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架 ...

  10. HDOJ(HDU).1035 Robot Motion (DFS)

    HDOJ(HDU).1035 Robot Motion [从零开始DFS(4)] 点我挑战题目 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双重DF ...

随机推荐

  1. TemplatePart用法说明

    原文:TemplatePart用法说明 TemplatePart(Name="PART_Decrease", Type=typeof(RepeatButton)) 一直没明白这是干 ...

  2. uboot通过使用U磁盘引导内核RT5350成功

    今天,在下次尝试使用16G 的u菜.这让两个分区,A位于zimage.一家商店rootfs:在uboot加载分区zimage并成功推出! RT5350 # fatload usb 0:1 0x80c0 ...

  3. opencart源码解析之 index.php

    //访问index.php,安全过滤.加载配置文件.核心启动文件.函数库.类库 //转载请注明: http://blog.csdn.net/dabao1989/article/details/2122 ...

  4. Html 空格与换行

    空格   换行 <br/>   调行距 <div style="line-height:10px"></div>

  5. wpf窗体定位

    原文:wpf窗体定位 据WPF外包小编了解,通常,不需要在屏幕上明确定位窗口.而是简单地将WindowState属性设置为Normal,并忽略其他所有细节.另一方面,很少会将WindowStartup ...

  6. Windows系统CPU内存网络性能统计第一篇 内存

    最近翻出以前做过的Windows系统性能统计程序,这个程序可以统计系统中的CPU使用情况,内存使用情况以及网络流量.现在将其整理一下(共有三篇),希望对大家有所帮助. 目录如下: 1.<Wind ...

  7. 基于Netbeans的安卓Android开发环境配置 - CSDN博客

    原文:基于Netbeans的安卓Android开发环境配置 - CSDN博客 基于Netbeans的安卓Android开发环境配置 一.准备工作 NetBeans 勾选网页中的Accept-选择对应系 ...

  8. SQLSERVER 数据库备份脚本-支持多库备份

    原文:SQLSERVER 数据库备份脚本-支持多库备份 <pre name="code" class="sql">--变量定义 DECLARE @b ...

  9. 动态加载XAML

    string FadeInStoryBoard = "<StoryBoard ... />"; StoryBoard storyBoard = XamlReader.L ...

  10. Android零基础入门第82节:Activity数据回传

    上一节学习了将简单的数据从MainActivity传递到SecondActivity,本节一起来学习数据如何从SecondActivity回传到MainActivity. 一.简介 前面己经提到,Ac ...