解题思路
这是一个贪心算法问题。需要使用最少的硬币数量来找零,由于硬币面值是4的幂次,可以使用贪心策略。
关键点:
- 硬币面值为1、4、16、64元
- 需要从1024元中找零
- 优先使用大面值硬币
- 保证找零的正确性
算法步骤:
- 计算需要找零的金额
- 从大到小使用硬币
- 统计硬币总数
代码
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int solve(int N) {
// 计算需要找零的金额
int change = 1024 - N;
// 可用的硬币面值
vector<int> coins = {64, 16, 4, 1};
// 记录需要的硬币数量
int count = 0;
// 从大到小使用硬币
for (int coin : coins) {
count += change / coin; // 使用当前面值的硬币数量
change %= coin; // 剩余需要找零的金额
}
return count;
}
};
int main() {
int N;
cin >> N;
Solution solution;
cout << solution.solve(N) << endl;
return 0;
}
import java.util.*;
public class Main {
static class Solution {
public int solve(int N) {
// 计算需要找零的金额
int change = 1024 - N;
// 可用的硬币面值
int[] coins = {64, 16, 4, 1};
// 记录需要的硬币数量
int count = 0;
// 从大到小使用硬币
for (int coin : coins) {
count += change / coin; // 使用当前面值的硬币数量
change %= coin; // 剩余需要找零的金额
}
return count;
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
Solution solution = new Solution();
System.out.println(solution.solve(N));
sc.close();
}
}
class Solution:
def solve(self, N):
# 计算需要找零的金额
change = 1024 - N
# 可用的硬币面值
coins = [64, 16, 4, 1]
# 记录需要的硬币数量
count = 0
# 从大到小使用硬币
for coin in coins:
count += change // coin # 使用当前面值的硬币数量
change %= coin # 剩余需要找零的金额
return count
# 读取输入
N = int(input())
solution = Solution()
print(solution.solve(N))
算法及复杂度
- 算法:贪心算法
- 时间复杂度:,硬币种类是固定的
- 空间复杂度:,只需要常数级额外空间