有 \(n\) 种货币。找一个最小的金额 \(x\),使得贪心法付款不是最优解;如果贪心法始终都是最优解,输出 \(-1\)。\((n\le 400)\)
将货币集合记作一个 \(n\) 维向量 \(C=(c_1,c_2,\dots,c_n)\)。对于金额 \(x\) 的一个表示法,也记作一个 \(n\) 维向量 \(V\)。即 \(C\times V=x\)。
记金额 \(x\) 的贪心表示法为 \(G(x)\),最小表示法为 \(M(x)\)。同时要求这两个表示法都是字典序最大的。
易证 \(G(x)\) 的子集也是贪心表示,\(M(x)\) 的子集也是最小表示。
设 \(w\) 是最小的使得 \(G(w)\neq M(w)\) 的金额。因为 \(w\) 最小,所以 \(G(w),M(w)\) 一定不存在一个维度上都是非零的,否则可以让 \(w\) 更小。
设 \(i,j\) 是 \(M(w)\) 的最小和最大的非零位。(比如 \(M(w)=(0,1,1,0,2,0)\) 中 \(i=2,j=5\))
结论:\(M(w)\) 和 \(G(c_{i-1}-1)\)的 \(1,\dots,j-1\)位相同,第 \(j\) 位大 \(1\)。
证明:
\(G(w)\) 在 \(1\sim i-1\) 维上一定有非零的,否则因为非零位无交,\(G(w)\) 的第 \(i\) 维一定是 \(0\),但是因为 \(M(w)\) 第 \(i\) 维非零,所以 \(w\ge c_{i-1}\),与贪心法矛盾。所以 \(w\ge c_{i-1}\)。(1)
因为 \(w\) 是最小的,所以 \(G(w-c_j)=M(w-c_j)\)。因为 \(i\) 是 \(M(w)\) 最小的非零位,且 \(M(w),M(w-c_j)\) 的区别只有第 \(j\) 维差一,所以 \(M(w-c_j)\) 的前 \(i-1\) 位都是 \(0\)。
\(G(w-c_j)=M(w-c_j)\) 得出 \(G(w-c_j)\) 的前 \(i-1\) 位都是 \(0\)。所以 \(w-c_j<c_{i-1}\)。(2)
由(1):\(c_{i-1}-1-c_i<w-c_i\)。所以 \(G(c_{i-1}-1-c_i)<G(w-c_i)=M(w-c_i)\),两边都给第 \(i\) 位加一,得到 \(G(c_{i-1}-1)<M(w)\)。(3)
由(2)有 \(w-c_j\le c_{i-1}-1\),则 \(G(w-c_j)\le G(c_{i-1}-1)\),所以 \(M(w-c_j)\le G(c_{i-1}-1)\)。(4)
结合(3)(4),发现 \(M(w-c_j)\le G(c_{i-1}-1)<M(w)\)。
这说明第 \(j\) 维的变动会导致它们大小关系变化,因此 \(M(w),G(w)\) 的前 \(j-1\) 维相等。而 \(M(w)\) 在第 \(j\) 维之后都是 \(0\)(因为 \(j\) 是最大的非零位),因此 \(M(w)\) 的第 \(j\) 维大于 \(G(w)\) 的第 \(j\) 维。
那有没有可能 \(M(w).j-G(w).j\ge 2\) 呢?不可能,因为 \(w-c_j<c_{i-1}\le w\)。
于是我们证明了这个结论。(是不是都忘记我们要证明什么了?)
但是怎么转换到代码上?
int G(int x) { //x用贪心法的答案
int ans = 0;
for (int i = 1; i <= n; i++) {
int d = x / c[i];
ans += d;
x -= c[i] * d;
}
return ans;
}
//...
int ans = 0x3f3f3f3f;
for (int i = 2; i <= n; i++) {
int x = c[i - 1] - 1;
int cnt = 0; //把j理解成可以用到哪一位,cnt会维护贪心法的答案
for (int j = i; j <= n; j++) {
int d = x / c[j];
cnt += d;
x -= c[j] * d; //维护i~j贪心法答案
if (cnt + 1 < G(c[i - 1] - 1 - x + c[j]))
ans = min(ans, c[i - 1] - 1 - x + c[j]);
//因为M(w)和G(c[i-1]-1)只有第j维相差1,所以M(w)的数量就是cnt+1
//此时cnt对应的w=c[i-1]-1-x+c[j],因为cnt维护的是i~j维的贪心法,所以要减去x;但是因为M(w)比G(c[i-1]-1)的第j维大1,所以要+c[j]
}
}
标签:le,int,题解,CF10E,零位,最小,表示法,贪心
From: https://www.cnblogs.com/FLY-lai/p/18048818