Java学习笔记---Java简单的代码算法优化(例)

例:用一张1元纸币兑换1分、2分、5分硬币,要求兑换50枚硬币,求出所有组合。

package mypackage01;

public class demo
{
	public static void main(String[] args)
	{
		func1();
		System.out.println("分割线-----------------------------------------------------------------");
		func2();
	}
	private static void func1()//方法1:通常我们会用遍历的方法去解决这一类型的问题
	{
		//分析:假设兑换了i枚一分硬币、j枚两分硬币、k枚五分硬币
		//则必须要满足条下列件:
		//i + 2*j + 5*k = 100
		//i + j + k = 50
		int m = 0;//m用于组合种类计数
		for (int i = 0; i < 51; i++)
		{
			for (int j = 0; j < 51; j++)
			{
				for (int k = 0; k < 51; k++)
				{
					if (i + 2*j + 5*k == 100 && i + j + k == 50)
					{
						m += 1;
						System.out.print("第" + m + "种组合:\t\t");
						System.out.print("一分硬币 " + i +" 枚\t\t");
						System.out.print("两分硬币 " + j +" 枚\t\t");
						System.out.print("五分硬币 " + k +" 枚\n");
					}
				}
			}
		}
	}
	private static void func2()//方法2:优化遍历项,减去不必要的性能损失
	{
		//分析:假设兑换了i枚一分硬币、j枚两分硬币、k枚五分硬币
		//则必须要满足条下列件:
		//i + 2*j + 5*k = 100
		//i + j + k = 50
		//其中令i为常量,则该方程为二元一次方程组
		//则k = i / 3; j = 50 - 4 * k;
		int m = 0;//m用于组合种类计数
		for (int i = 0; i <= 50; i++)
		{
			if (i % 3 == 0)
			{
				int k = i / 3;
				int j = 50 - 4 * k;
				if (j >= 0)
				{
				m += 1;
				System.out.print("第" + m + "种组合:\t\t");
				System.out.print("一分硬币 " + i +" 枚\t\t");
				System.out.print("两分硬币 " + j +" 枚\t\t");
				System.out.print("五分硬币 " + k +" 枚\n");
				}
			}
		}
	}
}

运行结果:
第1种组合:        一分硬币 0 枚        两分硬币 50 枚        五分硬币 0 枚
第2种组合:        一分硬币 3 枚        两分硬币 46 枚        五分硬币 1 枚
第3种组合:        一分硬币 6 枚        两分硬币 42 枚        五分硬币 2 枚
第4种组合:        一分硬币 9 枚        两分硬币 38 枚        五分硬币 3 枚
第5种组合:        一分硬币 12 枚        两分硬币 34 枚        五分硬币 4 枚
第6种组合:        一分硬币 15 枚        两分硬币 30 枚        五分硬币 5 枚
第7种组合:        一分硬币 18 枚        两分硬币 26 枚        五分硬币 6 枚
第8种组合:        一分硬币 21 枚        两分硬币 22 枚        五分硬币 7 枚
第9种组合:        一分硬币 24 枚        两分硬币 18 枚        五分硬币 8 枚
第10种组合:        一分硬币 27 枚        两分硬币 14 枚        五分硬币 9 枚
第11种组合:        一分硬币 30 枚        两分硬币 10 枚        五分硬币 10 枚
第12种组合:        一分硬币 33 枚        两分硬币 6 枚        五分硬币 11 枚
第13种组合:        一分硬币 36 枚        两分硬币 2 枚        五分硬币 12 枚
分割线-----------------------------------------------------------------
第1种组合:        一分硬币 0 枚        两分硬币 50 枚        五分硬币 0 枚
第2种组合:        一分硬币 3 枚        两分硬币 46 枚        五分硬币 1 枚
第3种组合:        一分硬币 6 枚        两分硬币 42 枚        五分硬币 2 枚
第4种组合:        一分硬币 9 枚        两分硬币 38 枚        五分硬币 3 枚
第5种组合:        一分硬币 12 枚        两分硬币 34 枚        五分硬币 4 枚
第6种组合:        一分硬币 15 枚        两分硬币 30 枚        五分硬币 5 枚
第7种组合:        一分硬币 18 枚        两分硬币 26 枚        五分硬币 6 枚
第8种组合:        一分硬币 21 枚        两分硬币 22 枚        五分硬币 7 枚
第9种组合:        一分硬币 24 枚        两分硬币 18 枚        五分硬币 8 枚
第10种组合:        一分硬币 27 枚        两分硬币 14 枚        五分硬币 9 枚
第11种组合:        一分硬币 30 枚        两分硬币 10 枚        五分硬币 10 枚
第12种组合:        一分硬币 33 枚        两分硬币 6 枚        五分硬币 11 枚
第13种组合:        一分硬币 36 枚        两分硬币 2 枚        五分硬币 12 枚

你可能感兴趣的:(Java学习笔记---Java简单的代码算法优化(例))