Many auctions involve the sale of a variety of distinct assets. Examples are airport time slots, delivery routes and furniture. Because of complimentarities (or substitution effects) between the different assets, bidders have preferences not just for particular items but for sets or bundles of items. For this reason, economic efficiency is enhanced if bidders are allowed to bid on bundles or combinations of different assets. This paper surveys the state of knowledge about the design of combinatorial auctions. Second, it uses this subject as a vehicle to convey the aspects of integer programming that are relevant for the design of such auctions and combinatorial markets in general.