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