換錢最少貨幣數
阿新 • • 發佈:2017-09-06
integer != font -1 length val 組成 ati 代碼
給定數組arr,arr中所有的值都為正數且不重復。每個值代表一種面值的貨幣,每種面值的貨幣可以使用任意張,在給定一個整數aim代表要找的錢數,求組成aim的最少貨幣數。
代碼:
public class MinCoins { public static int minCoins(int[] arr, int aim) { if(arr == null || arr.length==0 || aim<=0) { return 0; } int len = arr.length; intmax = Integer.MAX_VALUE; int[][] dp = new int[len][aim+1]; //初始化數組 for(int j=1; j<(aim+1); j++) { dp[0][j] = max; if((j-arr[0])>=0 && dp[0][j-arr[0]]!=max) { dp[0][j]= dp[0][j-arr[0]]+1; } } intleft=0; for(int i=1; i<len; i++) { for(int j=1; j<(aim+1); j++) { left = max; //重點在dp[i][j-arr[i]],不是dp[i-1][j-arr[i]],這是算法推到出來的結果 if((j-arr[i])>=0 && dp[i][j-arr[i]]!=max) { left = dp[i][j-arr[i]]+1; } dp[i][j]= Math.min(dp[i-1][j], left); } } for (int[] rows : dp) { for (int col : rows) { System.out.format("%5d", col); } System.out.println(); } return dp[len-1][aim] == max ? -1 :dp[len-1][aim]; } public static void main(String[] args) { int[] arr = {5,2,3}; System.out.println(minCoins(arr,20)); } }
給定數組arr,arr中所有的值都為正數且不重復。每個值代表一種面值的貨幣,在給定一個整數aim代表要找的錢數,求組成aim的最少貨幣數。
註意:此處只能用數組中的數,並且每個只能用一次。
代碼:
public class MinCoins { public static int minCoins(int[] arr, int aim) { if(arr == null || arr.length==0 || aim<=0) { return -1; } int len = arr.length; int max = Integer.MAX_VALUE; int[][] dp = new int[len][aim+1]; //初始化數組 for(int j=1; j<(aim+1); j++) { dp[0][j] = max; if((j-arr[0])==0) { dp[0][j]= 1; } } int left=0; for(int i=1; i<len; i++) { for(int j=1; j<(aim+1); j++) { left = max; if((j-arr[i])>=0 && dp[i-1][j-arr[i]]!=max) { left = dp[i-1][j-arr[i]]+1; } dp[i][j] = Math.min(dp[i-1][j], left); } } for (int[] rows : dp) { for (int col : rows) { System.out.format("%5d", col); } System.out.println(); } return dp[len-1][aim]==max ? -1 : dp[len-1][aim]; } public static void main(String[] args) { int[] arr = {5,2,3,5}; System.out.println(minCoins(arr,15)); } }
換錢最少貨幣數