【母函数】hdu2069(Coin Change)母函数加深

hdu2069

思路:组合问题,可以考虑用母函数,但是这里考虑组合的个数和组合的最大数。硬币的个数不超过100;而且硬币的 总值不大于250。要同时兼顾这些问题,同一总值,可以由不同个数的硬币组成,即相互对应的关系,就得考虑二维数组a[i][j]:用i表示组成的值,j表示所用的硬币个数。

import java.util.*;
class Main{
	public static void main(String args[]){
		int []coin={50,25,10,5,1};
		final int max1=255,max2=105;//max1表示总值不超过250,max2表示总个数不超过100
		Scanner sc=new Scanner(System.in);
		int[][] result=new int[max1][max2];
		int[][] change=new int[max1][max2];
		for(int i=0;i<=5;i++){//先将100个硬币以内,由50的硬币所组成的不超过250的值初始化
			result[i*coin[0]][i]=1;
		}
		for(int i=1;i<5;i++){//五种硬币不同组合
			for(int j=0;j<=250;j++){
				for(int k=0;k+j<=250;k+=coin[i]){//控制总值不超过250
					for(int numb=0;numb+k/coin[i]<=100;numb++){//控制总个数不超过100
						change[k+j][numb+k/coin[i]]+=result[j][numb];//从而得到由numb+k/coin[i]个硬币组成总值为k+j的方法数
					}
				}
			}
			for(int k=0;k<=250;k++){
				for(int numb=0;numb<=100;numb++){
					result[k][numb]=change[k][numb];
					change[k][numb]=0;
				}
			}
		}
		while(sc.hasNext()){
			int sum=0;
			int n=sc.nextInt();
			for(int i=0;i<=100;i++){//总方法数=总值为n的所有不同硬币数的方法数的总和
				sum+=result[n][i];
			}
			System.out.println(sum);
		}
	}
}

你可能感兴趣的:(杭电oj,母函数,编程算法)