4 回答

TA貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超8個(gè)贊
var cnt = 0;
function change(target, coins, usable) {
let coin = coins.shift();//應(yīng)該要給coin聲明變量,不聲明會(huì)默認(rèn)全局變量則導(dǎo)致下面for循環(huán)的值跟著變動(dòng),就一直不滿足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);//這里應(yīng)該復(fù)制一份coins,避免遞歸時(shí)候使用shift把數(shù)據(jù)給修改了.
}
}
}
change(1000, [500, 100, 50, 10], 15);
console.log(cnt);

TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個(gè)贊
既然是算法題,就應(yīng)該先考慮算法
其實(shí)這個(gè)問題轉(zhuǎn)化后就是求 有4個(gè)不同的數(shù)字在數(shù)組A中,抽取每個(gè)數(shù)字(允許多次抽取)總抽取數(shù)位N(N<=15),使得其總和等于X,問有多少可能(最少可能是0個(gè),即不能匹配抽?。?/p>
當(dāng)然,因?yàn)檫@個(gè)題中X和A已經(jīng)確定了,所以可以減少搜索規(guī)模。
前面給出了一種方法,我想用另外一種方法求解(位運(yùn)算)
根據(jù)前面的一些條件,其實(shí)可能可以映射到一個(gè)2bit(最大值為3)+4bit(最大值為15)+4bit(最大值為15)+4bit(最大值為15) 是數(shù)字上
其中2bit對(duì)應(yīng)于500的數(shù)量,因?yàn)閯偤玫扔?的可能是唯一的,所以可以退化為1bit+4bit+4bit+4bit的數(shù)字上(一共13bit)
且各段數(shù)據(jù)總和小于等于15,第二段也要小于等于10,所以遍歷符合條件的數(shù)字,就可以獲取最終結(jié)果了。下面是實(shí)現(xiàn)(這個(gè)題對(duì)這個(gè)來說不是最優(yōu)解,但如果A數(shù)據(jù)量擴(kuò)大,N擴(kuò)大和X擴(kuò)大,則可能是較優(yōu)解,因?yàn)橹皇菃渭兊谋闅v了,是O(N)復(fù)雜度算法),且這個(gè)算法實(shí)現(xiàn)邏輯也比較簡(jiǎn)單,語句也比較簡(jiǎn)單。
var A=[500,100,50,10];//
var RT=[[2,0,0,0]];//存儲(chǔ)最終結(jié)果
var s=0x1AFF; //起始數(shù)據(jù)
for(;s>0;s--){
//提取各個(gè)的系數(shù)
a0=s>>12;
a1=(s>>8)&0xf;
a2=(s>>4)&0xf;
a3=s&0xf;
if(a1>10 || a0+a1+a2+a3>15) continue; // 過濾掉不符合系數(shù)條件的
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);//輸出可能數(shù)量
添加回答
舉報(bào)