/**
 * 题目描述:
 * 第一题:人民币分为(1,5,10,20,50,100)的金额,若交易金额为19,收银(50),找零(20+10+1)交易所需人民币张数为4.
 * 或者收银(10+5+1+1+1+1)交易所需人民币张数为6.输入交易金额n,输出交易所需最少人民币数量
 * @author young
 *
 */
public class MoneyNumberLeast 
{
	
	private static int[] moneyArrays = {100, 50, 20, 10, 5, 1};
		
	private static int[] moneyNumber = new int[100];
	
	
	static
	{
		//初始化获得1-99交易额的最少人民币数量
		for(int i = 1; i < 100; i ++)
		{
			moneyNumber[i] = getMinNumberOfMoney(i);			
		}
	}
	
	/**
	 * n元进行分解,最少需要的人民币的数量
	 * @param n
	 * @return
	 */
	public static int getMoneyNumber(int n)
	{
		int sum = 0;
		for(int i = 0; i < moneyArrays.length; i ++)
		{
			int number = n / moneyArrays[i];
			sum += number;
			
			n = n % moneyArrays[i];
		}
		return sum;
	}
	
	
	/**
	 * 输入金额为n,返回最少的人民币数量
	 * @param n在1-99之间
	 * @return
	 */
	public static int getMinNumberOfMoney(int n)
	{
		if(n < 1 || n > 99) return -1;
		
		//第一种情况:直接支付不找零
		int  sum1 = getMoneyNumber(n);
		
		
		
		//第二种情况,支付,找零		
		int i = moneyArrays.length - 1;
		while(n / moneyArrays[i] != 0)
		{
			i--;
		}
		
		int sum2 = getMoneyNumber(moneyArrays[i] - n) + 1;			
		return Math.min(sum1, sum2);
	}
	
	
	public static int getMinNumber(int n)
	{
		
		//100以内的人民币数量
		int numberother = 0;
		//100元的人民币数量
		int number100 = n / 100;
		n = n % 100;
		if(n > 0)
		{
			numberother = moneyNumber[n];
		}
		
		return number100 + numberother;
	}	
}