穷举搜索
有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日, (由于疫情的原因)现在没有返校. 写博客,也可自己加强记忆,就当写写日记吧!!!
希望给个赞: 反正你又不亏, 顺便而已