找硬币

public class Coin {

	
	public static void getCoinMethod(int[]coins,int[] vesult,int money){
		for(int i=1;i<=money;i++){
			int min=i;
			for(int j=1;j<coins.length;j++){
				if(coins[j]<=i){
					int temp=vesult[i-coins[j]]+1;
					if(temp<min)min=temp;
				}
			}	
			vesult[i]=min;
			System.out.println(i+"需要组合个数:"+min);
		}
	}
	public static void main(String[] args) {
		int[]coins=new int[]{0,1,2,3,4,5,10,21,25};
		int money=50;
		int[]vesult=new int[money+1];
		getCoinMethod(coins,vesult,money);
		
		System.out.println("========================");
		
		System.out.println(Arrays.toString(coins));
		for(int i=1;i<=50;i++){
		int[][]result=new int[coins.length][i+1];
		getCoinMethod(coins,result,i);
		}
	}
	
	public static void getCoinMethod(int[]coins,int[][]result,int money){
		//result是一个二维的数组
		//           x标示coin的种类,y标示的结果的大小
		for(int init=1;init<=money;init++){
			result[1][init]=init;
		}
		
		for(int i=2;i<coins.length;i++){
			for(int j=1;j<=money;j++){
				
				result[i][j]=result[i-1][j];
				int count=j/coins[i];
				for(int k=0;k<=count;k++){
				 if(result[i][j]>result[i-1][j-k*coins[i]]+k)
					 result[i][j]=result[i-1][j-k*coins[i]]+k;
				}
			}
			//System.out.println(Arrays.toString(result[i]));
		}
		System.out.println(money+"组合数:");
		for(int n=coins.length-1;n>0;n--){
			int count=money/coins[n];
			if(money>=coins[n]&&result[n][money]==(result[n-1][money-coins[n]*count]+count)){
			    money=money-coins[n]*count;
			    System.out.print(coins[n]+":"+count+"个 +");
			}
		}
		System.out.println();
	}
}

结果的组合可能不是唯一的,转换为动态规划树的问题


找硬币

你可能感兴趣的:(找硬币)