演算法學習——動態規劃 例題:找零錢問題(java)
阿新 • • 發佈:2019-01-12
給定陣列arr,arr中所有的值都為正數且不重複。 每個值代表一種面值的貨幣,每種面值的貨幣可以使用任意張, 在給定一個整數aim代表要找的錢數,求還錢有多少種方法 動態規劃:首先我們設一個二維矩陣dp[arr.length][aim+1]dp[i][j]就是arr[0...i]錢組成j的方法種數
public class DTGH_ZhaoLingQian { public int coins3(int[] arr, int aim) { int[][] dp=new int[arr.length][aim+1]; for (int i = 0; i <arr.length ; i++) { dp[i][0]=1; } for (int i = 1; i <aim+1 ; i++) { if (i%arr[0]==0){ dp[0][i]=1; } } for (int i = 1; i <arr.length ; i++) { for (int j = 0; j <aim+1 ; j++) { for (int k = 0; k*arr[i] <=j ; k++) { dp[i][j] += dp[i-1][j-k*arr[i]]; } } } return dp[arr.length][aim+1]; }