【算法学习】枚举与剪枝(一)
生活随笔
收集整理的這篇文章主要介紹了
【算法学习】枚举与剪枝(一)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
namespace?枚舉與枝剪 {/*?????*?要找8元錢?????*?有5元、2元、1元、5角?????*?求所有解決方案?????*/????class?Program????{static?void?Main(string[]?args){//初始化,由于其中涉及到浮點運算,所以每位*10????????????int?total?=?80;//80角????????????int?_50?=?50;int?_20?=?20;int?_10?=?10;int?_5?=?5;//50角,最少0張?最多80/50????????????for?(int?a?=?0;?a?<=?total?/?_50;?a++){for?(int?b?=?0;?b?<=?total?/_20;?b++){for?(int?c?=?0;?c?<=?total?/?_10;?c++){for?(int?d?=?0;?d?<=?total?/?_5;?d++){if?(a?*?_50?+?b?*?_20?+?c?*?_10?+?d?*?_5?==?total){Console.WriteLine("5元="?+?a?+?",2元="?+?b?+?",1元="?+?c?+?",5角="?+?d);}}}}Console.ReadLine();}}} }以上算法未用到“枝剪”,如果運算的數字大一些,例如:800元,十幾種零鈔,這樣計算機就吃不消了,大概要運算一年,因為以上考慮了太多沒有意義的數據。例如:取了一張5元面值,不可能取足2張2元。“枝剪”就是去除這種過多的考慮,來增加運算效率
以下是用到“枝剪”的算法:
//初始化,由于其中涉及到浮點運算,所以每位*10????????????int?total?=?80;//80角????????????int?_50?=?50;int?_20?=?20;int?_10?=?10;int?_5?=?5;//50角,最少0張?最多80/50????????????for?(int?a?=?0;?a?<=?total?/?_50;?a++){for?(int?b?=?0;?b?<=?total?/_20;?b++){//枝剪二:過濾非法情況,有可能ab取得過大的值,如果這個名額<0,就沒有名額給下面分配了??if?((total?-?a?*?50)?<?0){break;}for?(int?c?=?0;?c?<=?total?/?_10;?c++){//枝剪三if?((total?-?(a?*?_50?+?b?*?_20?+?c?*?_10))?<?0){break;}//前面的幾種零鈔,一共用掉了多少名額,剩下算出d????????????????????????int?d?=?total?-?(a?*?_50?+?b?*?_20?+?c?*?_10)?/?_5;//枝剪一:d值根本不用算,因為可以用abc來求出????????????????????????//for?(int?d?=?0;?d?<=?total?/?_5;?d++)????????????????????????//{????????????????????????????if?(a?*?_50?+?b?*?_20?+?c?*?_10?+?d?*?_5?==?total){Console.WriteLine("5元="?+?a?+?",2元="?+?b?+?",1元="?+?c?+?",5角="?+?d);}//}????????????????????}}Console.ReadLine();}雖然更加混亂、難懂;但是運算速度和效率更快了
轉載于:https://my.oschina.net/duansheli/blog/260867
總結
以上是生活随笔為你收集整理的【算法学习】枚举与剪枝(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: delphi xe6 android L
- 下一篇: keybd_event跟SendMess