HDU3348--coins(贪心+思维)
题意: 你有面值为1,5,10,50,100的钱币分别若干张;求购买某一价值的物品所花的最少和最多钱币数。 思路: (1)最少的钱币数: 由于面值分别为1,5,10,50,100;大面值都可以由小面值凑数转化而来,故贪心策略适用,从大面值开始枚举,每次取当前能取的最大面值。 (2)最多的钱币数: 此时采用贪心策略不再成立了,因为若从小面值开始枚举,当前的最优解并不一定是全局的最优解了。(i.e. 商品价值为6,你有2张1,1张5,此时若按贪心策略,你先把1取完,还要凑4,但是你已经没有1,只剩下一张5了;但其实明明可以取1张1,1张5达到目标的),这是因为当前最优状态不能转移下去了,故可以采用DP做,也可以采用逆向思维继续用贪心,我要用出去最多,即我要剩下的最小,即对于总价值为(sum-price),求最小的钱币数,这就转化为(1)的问题了,最后总数减掉求出的剩下的最小钱币数就是用出的最大钱币数。 代码如下: # include <cstdio> # include <cstring> # include <algorithm> using namespace std ; typedef long long ll ; int main ( ) { int i , j ; int n , m ; int t ; ll a [ 10 ] ; //a[i]为每个价格对应的钱币的数量;