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); }
}
运行结果: