動態規劃-硬幣組合

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

}

運行結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章