亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

求解下面的程序是哪寫錯了嗎?

求解下面的程序是哪寫錯了嗎?

素胚勾勒不出你 2019-03-20 15:11:29
var cnt = 0;function change(target, coins, usable) {    coin = coins.shift();    if(coins.length==0) {        if(target/coin<=usable) {            cnt += 1;        }    }    else{        for(let i=0; i<=target/coin; i++) {            change(target-coin*i, coins, usable-i);        }    }}change(1000, [500, 100, 50, 10], 15);console.log(cnt);算法題目鏈接:https://max.book118.com/html/...。題目:當下,坐公交或者地鐵時大部分人都是刷卡的。不過,時至今日還在用現金支付的人還是比想象的多。本題我們以安置在公交上的零錢兌換機為背景。這個機器可以用紙幣兌換到 10 日元、50 日元、100 日元和 500 日元硬幣的組合,且每種硬幣的數量都足夠多(因為公交接受的最小額度為 10 日元,所以不提供 1 日元和 5 日元的硬幣)。兌換時,允許機器兌換出本次支付時用不到的硬幣。此外,因為在乘坐公交時,如果兌換出了大量的零錢會比較不便,所以只允許機器最多兌換出 15 枚硬幣。譬如用 1000 日元紙幣兌換時,就不能兌換出“100 枚 10 日元硬幣”的組合。求兌換 1000 日元紙幣時會出現多少種組合?注意,不計硬幣兌出的先后順序。
查看完整描述

4 回答

?
拉丁的傳說

TA貢獻1789條經驗 獲得超8個贊

var cnt = 0;

function change(target, coins, usable) {

    let coin = coins.shift();//應該要給coin聲明變量,不聲明會默認全局變量則導致下面for循環的值跟著變動,就一直不滿足target/coin<=usable的條件.

    if(coins.length==0) {

        if(target/coin<=usable) {

            cnt += 1;

        }

    }

    else{

        for(let i=0; i<=target/coin; i++) {

            change(target-coin*i, coins.slice(), usable-i);//這里應該復制一份coins,避免遞歸時候使用shift把數據給修改了.

        }

    }

}

change(1000, [500, 100, 50, 10], 15);

console.log(cnt);


查看完整回答
反對 回復 2019-04-04
?
烙印99

TA貢獻1829條經驗 獲得超13個贊

coins.shift() usable不知道你些內容是怎么定義的?


查看完整回答
反對 回復 2019-04-04
?
鴻蒙傳說

TA貢獻1865條經驗 獲得超7個贊

既然是算法題,就應該先考慮算法

其實這個問題轉化后就是求 有4個不同的數字在數組A中,抽取每個數字(允許多次抽?。┛偝槿滴籒(N<=15),使得其總和等于X,問有多少可能(最少可能是0個,即不能匹配抽?。?/p>

當然,因為這個題中X和A已經確定了,所以可以減少搜索規模。

前面給出了一種方法,我想用另外一種方法求解(位運算)

根據前面的一些條件,其實可能可以映射到一個2bit(最大值為3)+4bit(最大值為15)+4bit(最大值為15)+4bit(最大值為15) 是數字上

其中2bit對應于500的數量,因為剛好等于2的可能是唯一的,所以可以退化為1bit+4bit+4bit+4bit的數字上(一共13bit)

且各段數據總和小于等于15,第二段也要小于等于10,所以遍歷符合條件的數字,就可以獲取最終結果了。下面是實現(這個題對這個來說不是最優解,但如果A數據量擴大,N擴大和X擴大,則可能是較優解,因為只是單純的遍歷了,是O(N)復雜度算法),且這個算法實現邏輯也比較簡單,語句也比較簡單。


var A=[500,100,50,10];//

var RT=[[2,0,0,0]];//存儲最終結果

var s=0x1AFF; //起始數據

for(;s>0;s--){

    //提取各個的系數

    a0=s>>12;

    a1=(s>>8)&0xf;

    a2=(s>>4)&0xf;

    a3=s&0xf;

    if(a1>10 || a0+a1+a2+a3>15) continue; // 過濾掉不符合系數條件的

    if(a0*A[0]+a1*A[1]+a2*A[2]+a3*A[3] ===1000) RT.push([a0,a1,a2,a3]);

}

console.log(RT);

var cnt=RT.length;

console.log(cnt);//輸出可能數量


查看完整回答
反對 回復 2019-04-04
  • 4 回答
  • 0 關注
  • 586 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號