почитай про линейное программирование, динамическое программирование, максимальные потоки в графах и т.п. - вот одни из главных методов в комбинаторной оптимизации. если сможешь сформулировать задачу так, чтобы она сводилась к одну из них, то будет тебе счастье
если не сможешь, то придется использовать перебор и эвристики, тут теории мало, в осномном эмпирика. вот хорошее чтиво по этой теме
http://cs.gmu.edu/~sean/book/metaheuristics/