C/C++_查找算法_穷举搜索

穷举搜索

有20枚硬币, 可能包括4种类型: 1 元, 5元, 1角和5分.

已知20枚硬币的总价值为10元, 求各种硬币的数量.

例如: 4、11、5、0就是一种方案。而8、2、10、0是另一个可能的方案,显然方案并不是唯一的,请编写程序求出类似这样的不同方案一共有多少种?

(1)编程思路。
直接对四种类型的硬币的个数进行穷举。其中,1元最多10枚、5角最多20枚、1角最多20枚、5分最多20枚。

??? 如果以元为单位,则5角、1角、5分会化分成浮点型数据,容易计算出错。可以将1元、5角、1角、5分变成100分、50分、10分、5分,从而全部采用整型数据处理。

参考v1.1:

#include <iostream>

using namespace std;

int main()
{
	int a100 = 0; /* 1元硬币的数量 */
	int a50 = 0; /* 5角硬币的数量 */
	int a10 = 0; /* 1角硬币的数量 */
	int a5 = 0; /* 5分硬币的数量 */
	int cnt = 0; /* 记录可行的方案的总数 */

	for (a100 = 0; a100 <= 10; a100++)
	{
		for (a50 = 0; a50 <= 20; a50++)
		{
			for (a10 = 0; a10 <= 20; a10++)
			{
				for (a5 = 0; a5 <= 20; a5++)
				{
					if (a100 * 100 + a50 * 50 + a10 * 10 + a5 * 5 == 1000 && (a100 + a50 + a10 + a5) == 20)
					{
						cout << a100 << " , " << a50 << " , " << a10 << " , " << a5 << endl;
						cnt++;
					}
				} /* a5 end */
			} /* a10 end */
		} /* a50 end */
	} /* a100 end */
	cout << "可行的解决方案总共有: " << cnt << endl;
	
	system("pause");
	return 0;
}

运行环境: vs2019
运行结果:
在这里插入图片描述
参考v1.2:

#include <iostream>

using namespace std;



int main()
{
	int a100 = 0; /* 1元硬币的数量 */
	int a50 = 0; /* 5角硬币的数量 */
	int a10 = 0; /* 1角硬币的数量 */
	int a5 = 0; /* 5分硬币的数量 */
	int cnt = 0; /* 记录可行的方案的总数 */

	for (a100 = 0; a100 <= 10; a100++)
	{
		for (a50 = 0; a50 <= (1000 - a100) / 50; a50++)
		{
			for (a10 = 0; a10 <= (1000 - a100 * 100 - a50 * 50) / 10; a10++)
			{
				for (a5 = 0; a5 <= (1000 - a100 * 100 - a50 * 50 - a10 * 10) / 5; a5++)
				{
					if (a100 * 100 + a50 * 50 + a10 * 10 + a5 * 5 == 1000 && (a100 + a50 + a10 + a5) == 20)
					{
						cout << a100 << " , " << a50 << " , " << a10 << " , " << a5 << endl;
						cnt++;
					}
				} /* a5 end */
			} /* a10 end */
		} /* a50 end */
	} /* a100 end */
	cout << "可行的解决方案总共有: " << cnt << endl;
	
	system("pause");
	return 0;
}

运行结果:
在这里插入图片描述
穷举法(枚举法) 的基本思想是: 列举出所有可能的情况, 逐个判断有哪些符合问题所要求的条件, 从而得到问题的全部解答.

它利用计算机运算速度快, 精确度高的特点, 对要解决的问题列出所有可能的情况, 一个不漏的进行检查, 从中找出符合要求的答案.

穷举算法解决问题, 通常可以从两个方面进行分析:
(1)问题所涉及的情况: 问题所涉及的情况有哪些, 情况的总数必须可以确定. 把它描述出来.应用穷举时对问题所涉及的有限中情况必须一一举例, 既不能重复, 也不能遗漏。重复列举直接引发增解,影响解的准确性;而列举的遗漏可能导致问题解的遗漏。
(2)答案需要满足的条件:分析出来的这些情况,需要满足什么条件,才成为问题的答案。把这些条件描述出来。

结语:

学到的知识要, 多复习, 多总结, 多敲. 需要时间的积累, 才能引起质的改变. 自己写不出来的永远是别人的.

分享一下我的技巧: 代数法把具体的数字带进去, 看看能能能找到规律(掌握思想).
还有就是画图, 也很重要. 用笔画出来, 把数代进去, 方法虽然笨, 但真的很实用, 好记忆不如烂笔头!!! 还有多用debug(调试工具)

我是小白, C/C++功力…, 你懂得, 写的文章可能不是很好. 如果存在问题, 欢迎大神给予评判指正.
错了不可怕, 可怕的是找不出bug, 谁没错过!!!

最近学操作系统我认为, 学什么都要成本(时间), 即使它是免费的, 我个人认为要挑来学, 挑重点来学, 而不是从头到尾, 除非考试考研.

这个知识点我没有完全掌握, 就是会了也要复习, 革命尚未成功, 同志还需努力!!! , 我会回来反复复习的

今日是: 2020年5月17日, (由于疫情的原因)现在没有返校. 写博客,也可自己加强记忆,就当写写日记吧!!!

希望给个赞: 反正你又不亏, 顺便而已

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章