题解 CF10E 【Greedy Change】

· · 题解

思路:

对于一种币值 A ,我们找出一个略大于 A 仅用币值不小于 B 且小于 A 的货币表示的值 X ,

使得贪心算法在使用 A 后要用更多零碎的货币 这样,只要枚举 A 、 B ,找出最小的这样的值即可。

\large{\text{code\;:}}
#include "cstdio"
int n, dat[500], res = -1;
int main()
{
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
        scanf("%d", &dat[i]);
    for (int i = 1; i <= n; i++)
        for (int j = i + 1; j <= n; j++)
        {
            int cnt1 = 1, cnt2 = 0, W = dat[i] - 1, t;
            for (int k = i + 1; k <= j; k++) //非贪心做法
                cnt1 += (W / dat[k]), W %= dat[k];
            t = W = dat[i] - 1 - W + dat[j];
            for (int k = 1; k <= n; k++) //贪心做法
                cnt2 += (W / dat[k]), W %= dat[k];
            if (cnt1 < cnt2 && (res == -1 || res > t)) //判断
                res = t; 
        }
    printf("%d", res);
    return 0;
}