Yield losses due to a combination of random, systematic and parametric defects are rising as manufacturing processes scale to smaller features sizes. In embedded systems-on-chip, yield can be increased using slack-- under-utilization in execution and storage resources-- so that when components are defective, data and tasks can be re-mapped and re-scheduled. For any given system, the design space of possible slack allocations is both large and complex, consisting of every possible way to replace each component in the initial system with another from the component library. However, based on the observation that useful slack is often quantized, we have developed an approach that effectively and efficiently allocates execution and storage slack to jointly optimize system yield and cost. While exploring less than 1.62% of the slack allocation design space, our approach consistently outperforms alternative slack allocation techniques to find sets of designs within 4.27% of the yield-cost Pareto-optimal front.