题目地址:
https://www.lintcode.com/problem/give-change/description
给定 4 4 4种硬币,分别面值是 1 , 4 , 16 , 64 1,4,16,64 1,4,16,64,用 1024 1024 1024块钱买了一个价值为 N N N商品,问找钱最少硬币个数。
相当于问
1024
−
N
1024-N
1024−N能表达成若干
1
,
4
,
16
,
64
1,4,16,64
1,4,16,64的数字和,最少需要多少个数字。
思路是贪心。先用
64
64
64块钱的硬币,然后再用
16
16
16,然后
4
4
4和
1
1
1。
算法正确性证明:
设
x
=
1024
−
N
x=1024-N
x=1024−N,并且
x
=
64
a
0
+
16
a
1
+
4
a
2
+
a
3
x=64a_0+16a_1+4a_2+a_3
x=64a0+16a1+4a2+a3,容易知道最优解中不可能有
a
i
>
3
a_i>3
ai>3(除了
a
0
a_0
a0),否则就可以用面值更大的硬币代替。在这个条件下容易直接算出各个
a
a
a,例如
a
3
=
x
%
4
a_3=x\%4
a3=x%4等等。所以唯一性得证。
代码如下:
public class Solution {
/**
* @param amount: The amount you should pay.
* @return: Return the minimum number of coins for change.
*/
public int giveChange(int amount) {
// write you code here.
int x = 1024 - amount;
int res = 0;
int[] coins = {64, 16, 4, 1};
for (int i = 0; i < 4; i++) {
res += x / coins[i];
x %= coins[i];
}
return res;
}
}
时空复杂度 O ( 1 ) O(1) O(1)。