硬币问题 (贪心)

有1元、5元、10元、50元、100元、500元的硬币各C1   C5   C10  C50   C100   C500  。现在要用这些硬币来支付A元,最少需要多少枚硬币?

优化使用面值大的硬币。

贪心法就是遵循某种规则,不断贪心地选取当前最优策略的算法设计方法.

搜索算法和动态规划算法是在多种策略中选取最优解,而贪心算法则不同,它遵循某种规则,不断地选取当前最优解。

 1 const int V[6]={1,5,10,50,100,500};
 2
 3 //输入个数
 4 int C[6];
 5 int A;
 6
 7 void solve(){
 8     int ans=0;
 9
10     for(int i=5; i>=0; i--){
11         int t=min(A/V[i],C[i]);  //使用硬币i的枚数
12         A-=t*V[i];
13         ans+=t;
14     }
15
16     printf("%d\n",ans);
17 }

来自:<<挑战程序设计竞赛>>

时间: 2024-10-13 21:31:14

硬币问题 (贪心)的相关文章

历届试题 翻硬币-(贪心)

问题描述 小明正在玩一个“翻硬币”的游戏. 桌上放着排成一排的若干硬币.我们用 * 表示正面,用 o 表示反面(是小写字母,不是零). 比如,可能情形是:**oo***oooo 如果同时翻转左边的两个硬币,则变为:oooo***oooo 现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢? 我们约定:把翻动相邻的两个硬币叫做一步操作,那么要求: 输入格式 两行等长的字符串,分别表示初始状态和要达到的目标状态.每行的长度<1

某种 找换硬币问题的贪心算法的正确性证明

一,问题介绍 最近一直在看贪心算法的正确性证明(如何证明贪心算法获得的解一定是最优解),感觉“剪枝”技巧用得比较多.再看了下<算法导论>中贪心算法一章里面的一个练习---找换硬币问题.这个问题对于某些 面值的硬币 是有最优解的,故记录下其中的一些证明思路. 考虑用最少的硬币数 来找 n 分钱的问题,假设每个硬币的值都是整数. 如果可换的硬币的单位是 c 的幂,也就是 c0,c1,... ,ck ,其中整数 c>1,k>=1 证明贪心算法总可以产生一个最优解. 二,找换硬币的贪心策略

蓝桥杯 [翻硬币] 贪心

题目链接:http://lx.lanqiao.cn/problem.page?gpid=T29 题目大意:给两个串,初始串和目标串,每一位表示硬币的正反状态.一次操作的定义是让两个相邻的硬币反面.问从初始状态到目标状态所需要的最少操作次数是多少. 关键思想:贪心.要知道如果两个串的某一位不同,那这一位必然要经历奇数次操作,而且先翻或者后翻是没有影响的.那你想,既然是奇数次,那么最好的情况就是一次搞定啊.解决方案是有的,也很容易想--从左到右扫描,一旦扫描到一位不同,就执行一次操作,而此后的所有操

贪心算法解硬币找零问题

假如有一种货币,它有面值为1分.2分.5分和1角的硬币,最少需要多少个硬币来找出K分钱的零钱? 按照贪心算法的思想,需要不断地使用面值最大的硬币.如果要找零的值小于最大的硬币值,则尝试第二大的硬币,依次类推. 代码如下: #include <iostream> using namespace std; #define ONE 1 #define TWO 2 #define FIVE 5 #define TEN 10 int main() { int money; int one=0,two=0

BZOJ(begin) 1333 [Usaco2005 Oct]Allowance 津贴:贪心【给硬币问题】

题目链接:http://begin.lydsy.com/JudgeOnline/problem.php?id=1333 题意: 有n种不同币值的硬币,并保证大币值一定是小币值的倍数. 每种硬币的币值为val,数量为cnt. 每个月你要给Bessie发金额为c的津贴(可以比c多,但不能少). 问你最多能发多少个月. 题解: 贪心. 贪心策略: (1)如果能恰好凑出c的钱,则应尽可能使用大币值的硬币. (2)如果不能恰好凑出,则应让花的冤枉钱尽可能少. 实现: 先按币值从大到小排序... (1)在保

(一般)POJ-3040 贪心,硬币问题

题目大意:夫约翰要给奶牛Bessie发工资了(你们结婚吧,生个牛头人( ̄_ ̄|||) ),每周至少 C 元.约翰手头上有面值V_i的硬币B_i个,这些硬币的最小公约数为硬币的最小面值.求最多能发几周? 题目链接:点击打开链接 分析:此贪心解释如下: 1:大于c的就直接取: 2:如果小于就从大到小拿钱,能拿多少拿多少,但不能超过c: 3:如果2拿的钱小于c,就从小到大拿钱,能拿多少拿多少,但要求是超过c的时候是最小的,也就是说,这些钱的总和是大于c的最小数: 4:将此类取钱方式求出次数,加到cou

CF10E Greedy Change 判断硬币系统是否能用贪心策略

Billy investigates the question of applying greedy algorithm to different spheres of life. At the moment he is studying the application of greedy algorithm to the problem about change. There is an amount of n coins of different face values, and the c

十一:贪心算法-寻找硬币

问题:贪心算法-寻找硬币题目描述现有价值分别为:1 3 5 10的硬币若干.请用最少的硬币数量找出n(n<100000000)元钱.输入一个数字,表示要找出的钱的数量输出一个数字,表示需要多少硬币样例输入14样例输出 3 1 #include<stdio.h> 2 #include<stdlib.h> 3 long k=100000000; 4 int a[4]={1,3,5,10}; 5 void fun(int n,int m,int sum){ 6 int i; 7 i

初识贪心----硬币支付问题

题目: 有1元,5元,10元,50元,100元,500元的硬币各c1,c5,c10,c50,c100,c500枚.现在要用这些硬币来支付A元,最少需要多少枚硬币?假定本题至少存在一种支付方案.0≤ci≤109,0≤A≤109 输入:第一行有六个数字,分别代表从小到大6种面值的硬币的个数,第二行为A,代表需支付的A元. 样例: 输入: 3 2 1 3 0 2 620 输出: 6 分析:如果我们每次选面值尽可能大的,就能保证硬币数越小,(可用反证法证明正确性).因为不用大面值,将使用更多的小面值硬币