窮舉搜索
有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日, (由於疫情的原因)現在沒有返校. 寫博客,也可自己加強記憶,就當寫寫日記吧!!!
希望給個贊: 反正你又不虧, 順便而已