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日, (由於疫情的原因)現在沒有返校. 寫博客,也可自己加強記憶,就當寫寫日記吧!!!

希望給個贊: 反正你又不虧, 順便而已

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