一往直前!贪心法
贪心法的概念:遵循某个规则,不断贪心地选取当前最优策略的算法设计方法。
硬币问题
凭直觉,可以得到一个规则,尽可能地多用面值大的硬币。
硬币问题是贪心算法中较为简单的例子。在搜索算法和动态规则算法是在多种策略中选取最优解;而贪心算法它是遵循某种规则,不断地选取当前最优策略。
package main
import "fmt"
var coin = []int{
1, 5, 10, 50, 100, 500}
var coins = [6]int{
}
var A int
func solve() {
ans := 0
for i := 5; i >= 0; i-- {
t := min(A/coin[i], coins[i])
A -= t * coins[i]
ans++
}
fmt.Println(ans)
}
func min(a, b int) int {
if a < b {
return a
}
return b
}
func main() {
fmt.Scanf("%d %d %d %d %d %d", &coins[0], &coins[1], &coins[2], &coins[3], &coins[4], &A)
solve()
}
区间问题
这个问题不像前面的硬币问题那么简单。最容易想到的一种贪心算法如下:
在可选的工作中,每次都选取开始时间最早的工作。但这种情况对于下列情况无法得到正确的答案。
除此之外,还会想到其他的想法:
(1)在可选的工作中,每次都选取结束时间最早的工作
(2)在可选的工作中,每次都选取用时最短的工作
(3)在可选的工作中,每次都选取与最少可选工作有重叠的工作**(我觉得这个想不到)**
对结束时间排序,然后选取完任务后记录结束时间,寻找下一个开始时间比记录的结束时间要晚的任务。
package main
import (
"fmt"
"sort"
)
const N = 100000
var s =