动态规划-硬币组合

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;ilength+1;i++)
        {
            for(int j=0;j1;j++)
            {
                matrix[i][j]=0;
            }
        }
        for(int i=0;ilength+1;i++)
        {
            matrix[i][0]=1;
        }
        for(int j=1;j1;j++)
        {
            matrix[0][j]=0;
        }
        for(int i=1;ilength+1;i++)
        {
            for(int j=1;j1;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);
    }

}

运行结果:

你可能感兴趣的:(动态规划-硬币组合)