import java.util.Arrays;
public class Change {private static int countWays0(int coins[], int size, int total) {if (total == 0)return 1;if (total < 0)return 0;if (size <= 0)return 0;return countWays0(coins, size - 1, total) +countWays0(coins, size, total - coins[size - 1]);}private static long countWays1(int coins[], int size, int total) {long[] table = new long[total + 1];Arrays.fill(table, 0); table[0] = 1;for (int i = 0; i < size; i++)for (int j = coins[i]; j <= total; j++)table[j] += table[j - coins[i]];return table[total];}private static int countWays2(int coins[], int size, int total) {int table[] = new int[total + 1];table[0] = 1;for (int i = 0; i < size; i++)for (int j = coins[i]; j <= total; j++)table[j] += table[j - coins[i]];return table[total];}private static int coinMinChange(int[] coins, int amount) {Arrays.sort(coins);int size = coins.length;if (size == 0 || amount == 0)return 0;int[] dp = new int[amount + 1];Arrays.fill(dp, amount + 1);dp[0] = 0;for (int j = 0; j < size; j++) {for (int i = coins[j]; i <= amount; i++) {dp[i] = Math.min(dp[i], dp[i - coins[j]] + 1);}}return dp[amount] > amount ? -1 : dp[amount];}public static void main(String[] args) {int coins[] = {1, 2, 3};int size = coins.length;int total = 4;System.out.println(countWays0(coins, size, total));System.out.println(countWays1(coins, size, total));System.out.println(countWays2(coins, size, total));System.out.println(coinMinChange(coins, total));}}