I'm thinking this might be NP-complete, but I'll ask anyway. Greedy algorithms don't seem to work in my head.
Given a set of items, each with 1 or more tags, I want to find the smallest set of tags that cover all the items.
Edit: See my "solution" here.