動態規劃-硬幣組合
阿新 • • 發佈:2019-01-23
1.問題描述
對於m個面值為v1,v2,vm的硬幣,組成錢數n,不限制硬幣的數量和位置,求這些硬幣,最多有多少種組合的結果剛好等於n。
2.分析
n=x1*v1+x2*v2+....+xm*vm,{x1,x2,....,xm}就是其中的一種組合,定義l[i][k]為前i中硬幣組成錢數k的組合的總數
l[m][n]+=l[m-1][n-k*coinsValue[m]]
3.程式碼實現
public class CoinsTest { public static int coinTest(int [] coinValues,int n) { //定義matrix[i][sum]是有i種貨幣組合的值為sum的組合數int[][] matrix=new int[coinValues.length+1][n+1]; for(int i=0;i<coinValues.length+1;i++) { for(int j=0;j<n+1;j++) { matrix[i][j]=0; } } for(int i=0;i<coinValues.length+1;i++) { matrix[i][0]=1; } for(int j=1;j<n+1;j++) { matrix[0][j]=0; } for(int i=1;i<coinValues.length+1;i++) { for(int j=1;j<n+1;j++) { for(int k=0;k<=n/coinValues[i-1];k++) { matrix[i][j]+=matrix[i-1][n-k*coinValues[i-1]]; } } } return matrix[coinValues.length][n]; } public static void main(String[] args) { int [] coinValues={1,2,5}; int combinations=coinTest(coinValues,10); System.out.println("組合數位:"+combinations); }
}
執行結果: