请判断该算法属于暴力算法(Brute Force)还是贪心算法(Greedy)
算法归类:贪心还是暴力?
先看你的代码(修正了转义字符):
while(true) { int n = 0; int d = 0; int r = 0; int outcome = 0; n = scan.nextInt(); d = scan.nextInt(); r = scan.nextInt(); if ( n + d + r == 0) break; int[] morning = new int[n]; int[] afternoon = new int[n]; for (int i = 0; i < n; i++) { morning[i] = scan.nextInt(); } for (int i = 0; i < n; i++) { afternoon[i] = -scan.nextInt(); } for (int i = 0; i < n; i++) { int sum = morning[i] + (-afternoon[i]) - d; if (sum > 0) outcome += sum * r; } System.out.printf("%d\n", outcome); }
先明确两个算法的核心特征:
- 暴力算法:枚举所有可能的解空间(比如这个问题里所有早晚班次的配对组合),逐一验证后得到结果,时间复杂度通常很高(比如该问题暴力解的时间复杂度是O(n!),需要枚举全排列)。
- 贪心算法:每一步做出当前局部最优的选择,通过一系列局部最优决策逼近全局最优(比如该问题的经典贪心解法是将早班结束时间升序排序、晚班开始时间降序排序,再一一配对,以此最小化总加班费)。
对你的代码的判断:
你的代码既不属于贪心算法,也不属于暴力算法,它只是一个线性遍历的直接计算逻辑:
- 它没有枚举任何解空间,完全不存在暴力尝试的过程;
- 它也没有做任何局部最优的决策——只是严格按照输入顺序将第i个早班和第i个晚班配对,没有尝试寻找更优的配对方式(比如排序后配对),不存在“贪心选择”的步骤。
如果你的目标是计算固定配对顺序下的总加班费,这个逻辑是合理的;但如果是要找最小总加班费,这段代码的逻辑是错误的,此时正确解法才是贪心算法。
内容的提问来源于stack exchange,提问作者Yousuf L
相关产品推荐
相关产品推荐

