#### Overview of this book

C++ is a mature multi-paradigm programming language that enables you to write high-level code with a high degree of control over the hardware. Today, significant parts of software infrastructure, including databases, browsers, multimedia frameworks, and GUI toolkits, are written in C++. This book starts by introducing C++ data structures and how to store data using linked lists, arrays, stacks, and queues. In later chapters, the book explains the basic algorithm design paradigms, such as the greedy approach and the divide-and-conquer approach, which are used to solve a large variety of computational problems. Finally, you will learn the advanced technique of dynamic programming to develop optimized implementations of several algorithms discussed in the book. By the end of this book, you will have learned how to implement standard data structures and algorithms in efficient and scalable C++ 14 code.
Free Chapter
1. Lists, Stacks, and Queues
2. Trees, Heaps, and Graphs
3. Hash Tables and Bloom Filters
4. Divide and Conquer
5. Greedy Algorithms
6. Graph Algorithms I
7. Graph Algorithms II
8. Dynamic Programming I
9. Dynamic Programming II

## Subset Sum Problem

Imagine that you are implementing the logic for a digital cash register. Whenever a customer needs change, you would like to display a message that tells the cashier whether or not the money currently in the register can be combined in some way so that its sum is equal to the amount of change required. For example, if a product costs \$7.50 and the customer pays \$10.00, the message would report whether the money in the register can be used to produce exactly \$2.50 in change.

Let's say that the register currently contains ten quarters (10 x \$0.25), four dimes (4 x \$0.10), and six nickels (6 x \$0.05). We can easily conclude that the target sum of \$2.50 can be formed in the following ways:

10 quarters                    -> \$2.50

9 quarters, 2 dimes, 1 nickel -> \$2.25 + \$0.20 + \$0.05

9 quarters, 1 dime, 3 nickels -> \$2.25 + \$0.10 + \$0.15

9 quarters, 5 nickels   ...