插头DP(Socket DP)是一种动态规划算法,通常用于解决一些组合优化问题,如硬币找零问题、背包问题等。以下是一个插头DP的Java代码示例,用于解决硬币找零问题:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 public class SocketDP { public static int coinChange (int [] coins, int amount) { int [] dp = new int [amount + 1 ]; Arrays.fill(dp, amount + 1 ); dp[0 ] = 0 ; for (int coin : coins) { for (int i = coin; i <= amount; i++) { dp[i] = Math.min(dp[i], dp[i - coin] + 1 ); } } return dp[amount] > amount ? -1 : dp[amount]; } public static void main (String[] args) { int [] coins = {1 , 2 , 5 }; int amount = 11 ; int minCoins = coinChange(coins, amount); if (minCoins == -1 ) { System.out.println("It's impossible to make the amount with the given coins." ); } else { System.out.println("Minimum number of coins to make amount " + amount + ": " + minCoins); } } }
在这个示例中,coinChange
方法使用插头DP解决了硬币找零问题。算法通过构建一个一维数组 dp
来保存每个金额所需的最小硬币数量。通过逐步填表,我们可以找到构成给定金额的最少硬币数量。
这个示例是一个插头DP的实现,实际应用中可能需要根据不同的问题进行适当的修改。