HDU5527:Too Rich(DFS & 贪心 & 思维)

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

Too Rich

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 1613    Accepted Submission(s): 413


Problem Description
You are a rich person, and you think your wallet is too heavy and full now. So you want to give me some money by buying a lovely pusheen sticker which costs  p dollars from me. To make your wallet lighter, you decide to pay exactly  p  dollars by as many coins and/or banknotes as possible.

For example, if  p=17  and you have two  $10  coins, four  $5  coins, and eight  $1  coins, you will pay it by two  $5  coins and seven  $1  coins. But this task is incredibly hard since you are too rich and the sticker is too expensive and pusheen is too lovely, please write a program to calculate the best solution.
 

Input
The first line contains an integer  T  indicating the total number of test cases. Each test case is a line with 11 integers  p,c1,c5,c10,c20,c50,c100,c200,c500,c1000,c2000 , specifying the price of the pusheen sticker, and the number of coins and banknotes in each denomination. The number  ci  means how many coins/banknotes in denominations of  i  dollars in your wallet.

1T20000
0p109
0ci100000
 

Output
For each test case, please output the maximum number of coins and/or banknotes he can pay for exactly  p  dollars in a line. If you cannot pay for exactly  p  dollars, please simply output '-1'.
 

Sample Input
  
3 17 8 4 2 0 0 0 0 0 0 0 100 99 0 0 0 0 0 0 0 0 0 2015 9 8 7 6 5 4 3 2 1 0
 

Sample Output
  
9 -1 36
 

Source
题意:给若干个不同面值硬币,求凑成指定面额的最多硬币数量。

思路:比较巧妙地搜素,首先题目可以转化为拿走最少的硬币使得剩下硬币总额满足要求。那么按照贪心肯定是从面值最大的先拿,为什么这里直接贪心会正确呢?留意到题目给的面值前面的恰好是后面的因子,也就是说,大面值的能拿就拿走,否则还要小面值的凑成它,比如能拿50就拿50,否则以后还要拿5个10凑成50。还有一个问题,20不是50的因子,200不是500的因子,但是20却是50+50的因子,200却是500+500的因子,这意味着拿50和500的时候,还要考虑拿少一个硬币的情况,给20或200的硬币留空间,否则将会漏掉情况,如20,20,20,50凑60块这种数据。

# include <iostream>
# include <cstdio>
# include <cstring>
using namespace std;
typedef long long LL;
const LL INF = 0x3f3f3f3f3f3f3f3f;
LL a[]={0,1,5,10,20,50,100,200,500,1000,2000}, b[13];
LL ans;
void dfs(int cur, LL tot, LL cnt)
{
    if(tot < 0) return;
    if(cur == 0)
    {
        if(tot == 0)
            ans = min(ans, cnt);
        return;
    }
    LL tmp = min((LL)b[cur], tot/a[cur]);
    dfs(cur-1, tot-tmp*a[cur], cnt+tmp);
    if(tmp) dfs(cur-1, tot-(tmp-1)*a[cur], cnt+tmp-1);

}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        LL tot = 0, sum = 0, all = 0; ans = INF;
        scanf("%lld",&sum);
        for(int i=1; i<=10; ++i) scanf("%lld",&b[i]), tot += a[i]*b[i], all += b[i];
        if(tot < sum)
        {
            puts("-1");
            continue;
        }
        dfs(10, tot-sum, 0);
        if(ans == INF) puts("-1");
        else
            printf("%lld\n",all-ans);
    }
    return 0;
}



Oracle数据库的内存管理优化技巧 Oracle数据库作为企业级数据库管理系统,广泛应用于各种业务场景。内存管理是Oracle数据库性能优化的关键环节,合理的内存管理可以显著提高数据库的响应速度和吞吐量。本文的目的是深入探讨Oracle数据库内存管理的优化技巧,涵盖了系统全局区(SGA)和程序全局区(PGA)的管理、内存分配算法、内存参数调整等方面。通过详细的讲解和实际案例分析,帮助读者掌握优化Oracle数据库内存使用的方法,提高数据库的性能和稳定性。 阅读详情

相关推荐

CloudCompare点云滤波实战:三种植被去除技术的对比与应用

本文详细对比了CloudCompare中三种植被去除技术(低通滤波、CSF滤波和坡度法)的实战应用与效果。通过具体案例和参数优化建议,帮助用户根据地形特征选择最佳滤波方法,提升点云数据处理精度和效率,特别适用于复杂场景下的植被去除需求。

weixin_30689307的博客 68

HDU-5527 Too Rich (逆向思维+贪心,两种做法)

题目链接:https://vjudge.net/problem/HDU-5527 Too Rich You are a rich person, and you think your wallet is too heavy and full now. So you wa...

weixin_44757834的博客 315

OnePose++: Keypoint-Free One-Shot Object Pose Estimation without CAD Models

算法:首先采用LoFTR的细匹配模块,将粗匹配点周围的小窗口内,通过对比特征找到最相似的位置,细化当前特征点的位置。算法:PnP算法,利用3D点和2D投影点的对应关系,计算相机相对于物体的6D姿态(位置朝向)。算法:使用COLMAP,对2D粗匹配对(不依赖传统关键点匹配)进行特征轨迹计算并生成半稠密点云,每个3D点包含坐标和对应的2D投影点。算法:LoFTR粗匹配模块,将每一个像素点视为伪关键点,生成半稠密的2D匹配对。输入:优化后的3D、当前视图的2D特征点。输出:粗半稠密点云以及物体的特征轨迹。

雨落倾城的博客 857

贪心+dfs

即一个数组,然后在数轴中选择一个点,然后来回走,直到经过了所有的点,问走的最短路程是多少,用的是右上角的哪一个不等式来解决的,之后就把数轴上的点两两相结合 ,然后a1和an结合,一直到最小的中间,如果是奇数个,最后刚好·1剩下一个点,n/2,如果是偶数的话,中间两个点,任选一个就好。2 从前往后处理每个区间 判断能否将其放到某个现有的组中(看某一组的最后一个右端点是否大于新区间的左端点,如果大于,则不能放置,如果小于,则新区间就可以放置到该组中,同时这个组的最后一个右端点进行更新。来让编译器分的清除,,

m0_70208894的博客 971

dfs+贪心 三角形

我们发现对于第一条边(所组成的三角形里最短的边)而言,如果直接用dfs三重循环找边的话,它被重复找了好多次(也就是说dfs循环找出来的第一条边未必是现在能用的最短边),有极大的冗余。陈晫手上有 12 根木棒,它们的长度依次为 l1,l2,l3,...,l12。对于每组测试数据:仅一行,包含十二个整数 l1,l2,l3,...,l12。对于子任务 2, T < 20, li< 109,占 40%分数。•每组测试数据的答案只可能是 0,1,2,3,4 中的一个。)的时间少了一半,这样就解决的tle的问题。

m0_63799444的博客 370

hdu5527 Too Rich贪心

hdu5527题目你有一些面额的钱,要凑出p元而且钱数要尽量多。思路短小精悍的一道题,不过我还是绕啊绕的,先说我看别人的思路,就是反过来凑sum-p的最小数目,然后就是用贪心,但是并不是所有的小钱是它之前一项的约数,直接贪心并不正确,会有奇偶的分类,那我们就用搜索,同时记录用最多和少用一个即可,注意少用一个的前提是至少可以用一个。 感觉首先就是想不到反过来,还有就是是不是约数的影响,学习了orz代

天道酬勤 967

hdu5527 Too Rich

题目描述:Too RichTime Limit: 6000/3000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 169 Accepted Submission(s): 50Problem Description You are a rich person, and

ruclion的专栏 1755

2015 长春赛A && HDU5527 Too Rich贪心 + DFS】⭐

Too Rich 题意: 给你一定数量的面值分别为1,5,10,20,50,100,200,500,1000,20001,5,10,20,50,100,200,500,1000,20001,5,10,20,50,100,200,500,1000,2000的货币,要你用最多数量货币正好凑出ppp元。 【正向思维贪心 + DFS】 反向遍历:例如手里有6张十元和一张五十元,要求凑出70元。如果从十元开始贪,是凑不出70元的。所以只能反向遍历,先对面值较大的货币进行贪心,而后对面值较小的进行贪心。 贪多 :

lllllan 185

Too Rich HDU - 5527 (思维题+贪心)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5527 Too Rich Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 1253    Accepted Submissi

Vision 666

hdu 5527】 [2015ACM/ICPC亚洲区长春站] Too Rich 贪心

Too Rich Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 673 Accepted Submission(s): 173Problem Description You are a rich person, and y

ATOD 1571

HDU 5527 Too Rich(dfs贪心)

你有10种面值的货币,每个有ci个,然后让你正好凑p元,并且货币个数最多你有10种面值的货币,每个有c_i个,然后让你正好凑p元,并且货币个数最多 以前做过类似的贪心就是取最少的大的,然后用小的去凑大的以前做过类似的贪心就是取最少的大的,然后用小的去凑大的 但是这题不一样,因为50和20不整除,200和500也是但是这题不一样,因为50和20不整除,200和500也是 怎么办呢。考虑到100被

Miracle_ma的专栏 626

HDU 5527 Too Rich贪心+DFS

题意: 有1,5,10,20,50,100,200,500,1000,2000十种面值的钱币各ci个,现在要凑出p元,问最多可以用多少钱币凑出 思路: 取最多的钱币,就是要多取面额小的钱币。 从小贪心到大面额,存在一个问题: 例如: 110 19个1 2个20 2个50这组数据 我们无法正确的从1开始贪心,以保证贪心的结果是正确的。 那么,我们可以转化一下思路多取面额小的钱币即

DT2131 403

HDU 5527 Too Rich (好题 贪心 DFS)

HDU 5527 Too Rich (贪心 DFS)

Tc的专栏 2494

hdu 5527 Too Rich贪心

题目链接:hdu 5527 Too Rich解题思路从大的面值开始考虑,放的个数保证剩下的面值能用比当前面值小的硬币组成。这里只有50,500的情况比较特殊,因为有20和200可能要考虑多放一个的情况。代码#include <cstdio> #include <cstring> #include <algorithm>using namespace std; const int V[] = {0,

不慌不忙、不急不躁 1295

HDU5527 - Too Rich贪心

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5527题目大意:现在你有PP元钱,有1010种不同面值的硬币,每种硬币有一定的数量,求用尽量多的硬币凑出P元钱,有可能凑不出。解题过程:当初比赛没看这道题,最近才补,看起来挺简单的,实际知道思路上也不难……题目分析:要用尽量多的硬币凑PP元钱,假设我现在硬币总共的面值和为MM,那么换个思路,我现在要从总共

ACM_Fish的博客 652

HDU 5527 Too Rich (2015长春站A题&&贪心

比赛的时候最后35分钟队友写的,感觉最后可能太紧张了,写完了,但是没调完,然后这道题都没提交。。。分析:贪心,用尽量多的小面值的纸币来凑数,基本上每一个数都能整除后面一个数,所以前ii种面值最多能凑出sum[i]sum[i]圆,那么第i+1i+1种面值需要⌈p−sum[i]num[i+1]⌉\lceil{{p-sum[i]}\over{num[i+1]}}\rceil,此时有个小问题就是,2020并

无限大な梦のあとの 何もない世の中じゃ 778

HDU 5527 Too RichDFS

HDU 5527 Too RichDFS】 2015ACM/ICPC亚洲区长春站-重现赛(感谢东北师大) You are a rich person, and you think your wallet is too heavy and full now. So youwant to give me some money by buying a lovely pusheen sticker which costs p dollars fromme. To make your wallet lighte

Dust_heart的博客 589

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

题目链接 题意 : 给出一些固定面值的硬币的数量、再给你一个总金额、问你最多能用多少硬币来刚好凑够这个金额、硬币数量和总金额都很大 分析 : 长春赛区的金牌题目 一开始认为除了做类似背包DP那样子的DP外、别无他法 时空限制下是不可能DP的 众所周知背包DP问题贪心是错的 遂认定不是贪心方向 看到题解、真香~ 这种凑硬币问题、如果满足一个条件、那么贪心是正确的 ...

168

HDU 5527 Too rich 贪心 + DFS

  题目链接: https://vjudge.net/contest/162184#problem/A   题目描述: 给出一个整数 p , 给出1, 5, 10, 20, 50, 100, 200, 500, 1000, 2000 的数量, 要求用最多的数拼成 p 。   解题思路: 贪心, 要凑出最多的数量必须让面值越大的数数量越少, 所以sum[i]记录从 0 ~ i 手中持有的价值总,...

weixin_34233421的博客 172

Too Rich HDU - 5527贪心+dfs

Too Rich Time Limit: 6000/3000 MS (Java/Others)Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 1850Accepted Submission(s): 480 Problem Description You are a rich person, and...

weixin_30401605的博客 119
上一篇: AGC:D - ABS(博弈)
下一篇: HDU5696:区间的价值(搜索 & 分治 & 思维)
junior19
博客等级 码龄10年 118粉丝 615原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值