Greedy algorithms make locally optimal choices at each step in the hopes of finding a global optimum. They have two key properties: the greedy choice property, where choices are not reconsidered, and optimal substructure, where optimal solutions contain optimal solutions to subproblems. The activity selection problem of scheduling non-conflicting activities is used as an example. It can be solved greedily by always selecting the activity with the earliest finish time. While greedy algorithms are simple, they do not always find the true optimal solution.