【19HDU多校】Rikka with Coin,贪心
传送门
题意是说有面值10 20 50 100
的钱,有n个价格给定的菜,要求用最少的硬币数量,使得所有n个菜品的价格都能被凑出来。
贪心:直观想法是先用大的面值,依次用小的面值。
这样的话可以发现10, 20, 20, 50
四个面值能凑出所有100以内的价格。
但是有个例外:90 110 这样的数据,如果按照上面的贪法是100 50 20 20 10五个硬币,实际上只需要50 20 20 20四个硬币就可以拼出来。
所以进一步发现用10 20 20 20 50
五个硬币可以包含所有最优方案。两个10肯定能用一个20代替,四个20肯定能用一个50 20 10代替。
所以做一个10 20 20 20 50的子集生成。然后暴力判断dish[i] % 100 + 100
和dish[i] % 100
在某个组合的子集生成里有没有。(有先后顺序,第一个如果有了第二个就不用判断。因为既然零钱数量是固定的,那么100圆的越少约好)如果有,100圆的数量就分别是(dish[i] - (dish[i] % 100 + 100)/ 100)
,和dish[i] / 100
。
对于100圆判断是个重要细节。
比如1000 90 110这样的数据,1000其中的100圆可以用零钱拼出来,所以100圆个数只有9个。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[5] = {10, 20, 20, 20,
… Read the rest