<p>You are given an integer array <code>coins</code> representing coins of different denominations and an integer <code>amount</code> representing a total amount of money.</p> <p>Return <em>the fewest number of coins that you need to make up that amount</em>. If that amount of money cannot be made up by any combination of the coins, return <code>-1</code>.</p> <p>You may assume that you have an infinite number of each kind of coin.</p> <p> </p> <p><strong>Example 1:</strong></p> <pre> <strong>Input:</strong> coins = [1,2,5], amount = 11 <strong>Output:</strong> 3 <strong>Explanation:</strong> 11 = 5 + 5 + 1 </pre> <p><strong>Example 2:</strong></p> <pre> <strong>Input:</strong> coins = [2], amount = 3 <strong>Output:</strong> -1 </pre> <p><strong>Example 3:</strong></p> <pre> <strong>Input:</strong> coins = [1], amount = 0 <strong>Output:</strong> 0 </pre> <p> </p> <p><strong>Constraints:</strong></p> <ul> <li><code>1 <= coins.length <= 12</code></li> <li><code>1 <= coins[i] <= 2<sup>31</sup> - 1</code></li> <li><code>0 <= amount <= 10<sup>4</sup></code></li> </ul>