当前位置: 首页 > Web前端 > JavaScript

从0到1动态规划入门

时间:2023-03-27 11:54:30 JavaScript

浠庤椽蹇冿紙灞€閮ㄦ渶浼橈級鍑哄彂璐績绠楁硶鐨勫熀鏈€濇兂濡備笅锛?.灏嗗緟瑙e喅鐨勯棶棰樺垎瑙f垚鑻ュ共涓瓙闂锛屾眰瑙e瓙闂-闂姹傚緱瀛愰棶棰樼殑灞€閮ㄦ渶浼樿В2.鍚堝苟瀛愰棶棰樼殑灞€閮ㄦ渶浼樿В锛屽緱鍒板熀浜庡眬閮ㄦ渶浼樿В鐨勭粨鏋溿€傛墍璋撹椽蹇冿紝灏辨槸鍏虫敞褰撳墠锛堝眬閮級鏈€浼樼粨鏋滐紝鑰屼笉鏄粠鍏ㄥ眬锛堝叏灞€锛夌殑瑙掑害鍘昏€冭檻銆備袱绉嶆€濊矾鍒嗗埆瀵瑰簲灞€閮ㄦ渶浼樿В鍜屾暣浣撴渶浼樿В銆傚彲瑙佽椽蹇冨眬閮ㄦ渶浼樼Н鍒嗙殑缁撴灉寰€寰€涓嶆槸鍏ㄥ眬鏈€浼樿В锛佷緥濡傦細322.闆堕挶鍏戞崲闂锛氱粰浣犱竴涓暣鏁版暟缁刢oins锛屼唬琛ㄤ笉鍚岄潰棰濈殑纭竵锛涘拰涓€涓暣鏁癮mount锛屼唬琛ㄦ€婚噾棰濄€傝绠楀苟杩斿洖鏋勬垚鎬婚噺鎵€闇€鐨勬渶灏戠‖甯佹暟銆傚鏋滄病鏈夌‖甯佺粍鍚堟瀯鎴愭€绘暟锛屽垯杩斿洖-1銆傛偍鍙互璁や负姣忎釜纭竵鐨勬暟閲忔槸鏃犻檺鐨勩€傛寜鐓ц椽蹇冪殑鎯虫硶锛岄€氳繃浠庡ぇ鍒板皬鏋氫妇鎵€鏈夌殑纭竵闈㈤锛屾垜浠簲璇ヤ紭鍏堜娇鐢ㄥ敖鍙兘澶氱殑闈㈤澶х殑纭竵锛岃繖鏍蜂娇鐢ㄧ殑纭竵鏁伴噺灏变細瓒婂皯瓒婂ソ锛佷唬鐮佸涓?/馃帹鏂规硶涓€锛氳椽蹇冪畻娉?/馃摑鎬濊矾锛氳椽蹇冨緱鍒板眬閮ㄦ渶浼橈紝浣嗕笉涓€瀹氭槸鍏ㄥ眬鏈€浼橈紝鎵€浠ユ湁鐢ㄤ緥浣嗘槸/***@param{number[]}coins*@param{number}amount*@return{number}*/varcoinChange=function(coins,amount){letrest=amount;璁╄鏁?0锛沜oins.sort((a,b)=>b-a);//浠庡ぇ鍒板皬閬嶅巻闈㈤for(letcoinofcoins){//璁$畻褰撳墠闈㈤鍙互浣跨敤澶氬皯letcurrCount=Math.floor(rest/coin);//绱褰撳墠闈㈤浣跨敤count+=currCount;//浣跨敤褰撳墠闈㈤鏇存柊鍓╀綑闈㈠€煎悗rest-=coin*currCount;濡傛灉锛堜紤鎭?==0锛墈杩斿洖璁℃暟锛泒}杩斿洖-1;};璐績骞朵笉閫傚悎鎵€鏈夌殑闂锛堟湁浜涚敤渚嬫病鏈夐€氳繃锛夛紝姝f槸鍥犱负鏈夋椂鍊欏お璐績浜嗭紒渚嬪锛氫粠coins[0]=5锛宑oins[1]=3锛宬=11鐨勬儏鍐典腑姹傛渶灏戠殑纭竵鏁伴噺鏍规嵁鈥滆椽蹇冩€濇兂鈥濓紝鍏堥€夋嫨闈㈠€兼渶澶х殑纭竵锛屽嵆锛?涓‖甯侊紝鏀惧叆閽卞寘銆傞偅涔堬紝杩樻湁6涓厓绱犻渶瑕佹眰瑙o紙鍗?1-5=6锛夈€傝繖鏃跺€欏啀鈥滆椽蹇冣€濓紝鎶曞叆涓€鏋氶潰鍊?鍏冪殑纭竵銆傝繖鏃跺€欏彧鍓╀笅1鍧楅挶浜嗭紝濡傛灉浣犳姇鍏?锛屽氨涓嶈兘鍙噾11鍧楅挶銆備絾瀹為檯涓婅繖涓棶棰樻槸鏈夎В鐨勶紙5+3+3=11锛夈€傝繖鏄繃搴﹁椽濠鑷寸殑闂锛屽彲浠ラ€氳繃鍥炴函鏉ヨВ鍐筹紝灏卞儚锛氱數姊秴杞斤紝鑳栧瓙涓婃潵鐦﹀瓙涓婃潵//馃帹鏂规硶浜岋細鍥炴函+閫掑綊//馃摑鎬濊矾锛氫娇鐢╟asefailed/***@param{number[]}coins*@param{number}amount*@return{number}*/varcoinChange=function(coins,amount){//缁勫悎纭竵鐨勬暟閲弆etres=Infinity;coins.sort((a,b)=>b-a);if(coins.length===0){杩斿洖-1;}/***浠庡綋鍓嶇粍鍚堜腑鎵惧埌鏈€灏戠殑纭竵鏁?@param{*}coins*@param{*}total*@param{*}index*@returns*/constgetMinCoinCountOfValue=(coins,total,index)=>{if(index===coins.length){returnInfinity;}璁﹎inResult=Infinity;璁ヽurrValue=coins[index];璁﹎axCount=Math.floor(total/currValue);for(letcount=maxCount;count>=0;count--){璁﹔est=total-count*currValue;if(rest===0){minResult=Math.min(minResult,count);}璁﹔estCount=getMinCoinCountOfValue(coins,rest,index+1);if(restCount===Infinity){if(count===0){涓柇锛泒缁х画;}minResult=Math.min(minResult,count+restCount);}杩斿洖鏈€灏忕粨鏋滐紱};/***鎵惧埌鎵€鏈夋弧瓒虫潯浠剁殑缁勫悎*@param{*}coins*@param{*}amount*@param{*}index*/constgetMinCoinCount=(coins,amount,index)=>{//condition鐢ㄤ簬閫掑綊缁堟if(index===coins.length){//getMinCoinCountOfValue()鎵惧埌閲嶆柊鎺掑簭纭竵鐨勬渶灏忕‖甯佹暟閲弐es=Math.min(res,getMinCoinCountOfValue(coins,amount,0));}for(leti=index;ib-a);if(coins.length===0){杩斿洖-1;}/***姹傛€婚浂閽卞彲浠ュ厬鎹㈢殑鏈€灏戠‖甯佹暟閲?@param{*}coins*@param{*}total*@returns*/constgetMinCoinCount=(coins,total)=>{//閫掑綊缁堟鏉′欢if(total<0){return-1;}//閫掑綊缁堟鏉′欢if(total===0){return0;}//浠庡湪缂撳瓨涓煡鎵緈emo[total]寮€濮媔f(memo[total]!==-2){returnmemo[total];}璁﹎inCount=Infinity;//閬嶅巻鎵€鏈夐潰棰漟or(leti=0;itotal){缁х画;}//浣跨敤褰撳墠闈㈤骞舵壘鍒板墿浣欐€绘暟鐨勬渶灏忕‖甯佹暟letrestCount=getMinCoinCount(coins,total-coins[i]);if(restCount===-1){//褰撳墠閫夋嫨鐨刢oins[i]鐨勭粍鍚堟棤鏁堬紝璺宠繃缁х画锛泒//鏇存柊鏈€灏忓悎璁″€糽ettotalCount=1+restCount;濡傛灉锛堟€昏鏁?鏈€灏忚鏁帮級{鏈€灏忚鏁?鎬昏鏁帮紱}}//濡傛灉娌℃湁鍙敤鐨勭粍鍚堬紝鍒欒繑鍥?1if(minCount===Infinity){memo[total]=-1;杩斿洖-1锛泒//鏇存柊缂撳瓨memo[total]=minCount;杩斿洖鏈€灏忚鏁帮紱};杩斿洖getMinCoinCount锛堢‖甯侊紝鏁伴噺锛夛紱}锛涜蹇嗘悳绱㈡槸涓€涓嚜涓婅€屼笅鐨勯€掑綊杩囩▼銆備笉鏂皢澶ч棶棰樻媶瑙f垚灏忛棶棰橈紝鐒跺悗涓€涓竴涓В鍐冲皬闂锛屾槸闈炲父鐩磋鐨勩€備絾鏄瓨鍦ㄦ€ц兘闂锛堝熀浜庢爤锛屽鑷撮澶栫殑鏃堕棿鍜岀┖闂村紑閿€锛夊拰闅句互璋冭瘯绛夐棶棰樸€備负浜嗛伩鍏嶉€掑綊锛堝唴瀛樻悳绱級鐨勭己鐐癸紝杩唬鍜屽姩鎬佽鍒掑彲浠ュ皢鑷笂鑰屼笅鐨勯€掑綊瀹炵幇杞寲涓鸿嚜涓嬭€屼笂鐨勮凯浠e疄鐜般€傚鏋滃湪棰勬祴姣忎釜澶ч棶棰樹箣鍓嶅繀椤诲鐞嗛偅浜涘皬闂锛岄偅涔堝彲浠ュ厛瑙e喅鎵€鏈夊皬闂鐨勮В鍐虫柟妗堬紝鐒跺悗鍐嶈В鍐冲ぇ闂鐨勮В鍐虫柟妗堛€傝繖鏄竴涓嚜涓嬭€屼笂鐨勮繃绋嬨€傚鏋滃瓙闂鐨勪緷璧栨槸鍗曞悜鐨勶紝锛坅渚濊禆b锛屼絾b涓嶇洿鎺ユ垨闂存帴渚濊禆a锛夛紝閭d箞鍙互鐩存帴鑷簳鍚戜笂姹傝В銆?/馃帹鏂规硶浜旓細鍔ㄦ€佽鍒?/馃摑鎬濊矾锛氳嚜涓嬭€屼笂锛岃蹇嗘悳绱?***@param{number[]}coins*@param{number}amount*@return{number}*/varcoinChange=function(coins,amount){//memo[total]琛ㄧず鏈€灏戝彲浠ュ厬鎹otal鐨勭‖甯佹暟閲忥紝娌℃湁缂撳瓨鍒欎负-1constmemo=newArray(amount+1).fill(-1);//鍒濆鍖栫姸鎬乵emo[0]=0;//鎬昏揣甯佸€肩姸鎬佷粠1鍒癮mountfor(letv=1;v<=amount;v++){//褰撳墠鎬昏揣甯佸€紇瀵瑰簲鏈€灏戝彲浠ユ敹闆嗙殑纭竵鏁發etminCount=Infinity;//鏋氫妇褰撳墠鎬昏揣甯佷环鍊紇鐨勬墍鏈夌‖甯侀潰棰漟or(leti=0;iv){continue;}//浣跨敤褰撳墠闈㈠€煎緱鍒板墿浣欒揣甯佹€诲€糽etrest=v-currValue;//浠庣紦瀛樹腑鍙栧嚭鎬诲墿浣欏竵鍊煎搴旂殑鏈€灏忓竵鏁發etrestCount=memo[rest];//-1琛ㄧず缁勫悎涓嶆垚绔嬶紝璺宠繃if(restCount==-1){continue;}//褰撳墠璐у竵鍊肩粍鍚堟垚绔媗etcurrCount=1+restCount;//鏇存柊褰撳墠鎬昏揣甯佸€紇鐨勬渶灏忕‖甯佹暟if(currCount