1. 程式人生 > >動態規劃-硬幣組合

動態規劃-硬幣組合

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); }

}

執行結果: