算法=>魔法硬幣

魔法師小遁手里沒有硬幣谒拴,現有A機器,投入硬幣后可得到2x+1個涉波,有B機器英上,投入硬幣可得到2x+2 個,
請幫助小遁獲得數目恰好的硬幣

1.窮舉法

在違法的邊緣試探.jpg
let x = 0;
//已有硬幣總數
let count = 10;
//想要獲得硬幣的總數    

let j = 0;
put_x(0, 0, 0, [])
/* 
    i 投入的硬幣數目
    x 已有硬幣數
    size 已有硬幣數
    stack  記錄投入的信息
*/
function put_x(i, x, size, stack) {
    if (j++ > 1600) {
        //預防編寫階段進入死循環(huán)
        return;
    }
    let current = size;
    let length = stack.length;
    do {
        //先投入A機器
        size = current + 2 * i + 1;
        stack[length] = i;
        stack[length + 1] = 1;
        stack[length + 2] = size;
        if (size < count) {
            put_x(0, size, size, [].concat(stack))
        } else {
            if (size == count) {
                console.log(size, stack)
            }
            return;
        }

        //放入B機器
        //這里重新計算了 size 以及stack的信息

        size = current + 2 * i + 2;
        stack[length] = i;
        stack[length + 1] = 2;
        stack[length + 2] = size;
        if (size < count) {
            put_x(0, size, size, [].concat(stack))
        } else {
            if (size == count) {
                console.log(size, stack)
            }
            return;

        }
        i++;

    } while (i <= x)
}

經過上面的思考我發(fā)現

應該總是先投B機器啤覆,而且每次盡量投最多的硬幣
每次應該減去投進去的硬幣才是最終獲得硬幣數量

2 最少的投擲次數

我覺得ok.jpg
let j = 0;
coin(9);
function coin(count){

    //記錄投入的信息
    let stack = [];
    
    computer(0,0);
    console.table(stack)
    /*
        size  想要得到的硬幣數
    */
    function computer(size,number){
        //防止陷入死循環(huán)
        if(j++ > 1600) return;

        //由 count = 2*time - 2 - size 推導  
        //得到最多可以投入的硬幣數
        //先投入B機器
        let time = Math.floor(count - size - 2);
        
        
        if(time < 0){//再次投入B機器會超出
            //投入A機器
            time =  Math.floor(count - size - 1 );
            number = time + 1 + size ;
            //投入的機器  投入的硬幣數  得到的硬幣數 上次擁有的硬幣數  現擁有的硬幣數 
            stack.push(['A',time,2*time+1,size,number])
        }
        else{
            if(time > number){//防止投入的硬幣超出已有的
                time = number;
            }
            number = time + 2 + size;
            stack.push(['B',time,2*time+2,size,number])
        }
        
        if(number < count){
            computer(number,number);
        }

    }

}
image.png

為什么投入A機器不需要time<0的判定苍日,是因為time數是推算出來的,如果B機器不能投窗声,A機器也不能投相恃,那豈不是存在無法得到的數?

是否真的存在當前算法無法得到的數笨觅?

經過幾個數的測試 我發(fā)現如下規(guī)律

需要一個1的時候才會用到A 因為奇數 = 偶數 - 1
總是可以通過投入B機器 來減少投入A機器需要得到的硬幣數 因為我們先投入B機器
因為投入B機器的硬幣數可以是奇數 => 產生偶數 + 上次總的是偶數 - 投入奇數取 = 奇數
所以并非所有奇數都會用到A機器(1拦耐,3,7會用到)

綜上所述 可以用

number = count ;
stack.push(['A',0,1,size,count])

代替if(time < 0) 里面的代碼

然而有一種叫做逆向推理的過程

為么不計算想要得到總數之前需要投入多少硬幣呢见剩,也就是每次把所擁有的硬幣都投入進去

打臉.jpg
computer(110);
function computer(count){

    let stack = [];
    let size = count;
    let lastSize = size;
    while(size>0){
        
        if(size%2 == 0){
            size = Math.floor((size - 2)/2);
            stack.push(['B',size,lastSize])
        }
        else{
            size = Math.floor((size - 1)/2)
            stack.push(['A',size,lastSize])
        }
        lastSize = size;
        
    }
    console.table(stack)
}

顯然這種解法要優(yōu)于之前的杀糯,之前算法出現不能將已擁有所有硬幣放入B機器時,可能會多出一步

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末苍苞,一起剝皮案震驚了整個濱河市固翰,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖骂际,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疗琉,死亡現場離奇詭異,居然都是意外死亡歉铝,警方通過查閱死者的電腦和手機没炒,發(fā)現死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來犯戏,“玉大人,你說我怎么就攤上這事拳话∠确耍” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵弃衍,是天一觀的道長呀非。 經常有香客問我,道長镜盯,這世上最難降的妖魔是什么岸裙? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮速缆,結果婚禮上降允,老公的妹妹穿的比我還像新娘。我一直安慰自己艺糜,他們只是感情好剧董,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著破停,像睡著了一般翅楼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上真慢,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天毅臊,我揣著相機與錄音,去河邊找鬼黑界。 笑死管嬉,一個胖子當著我的面吹牛,可吹牛的內容都是我干的园爷。 我是一名探鬼主播宠蚂,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼童社!你這毒婦竟也來了求厕?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎呀癣,沒想到半個月后美浦,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡项栏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年浦辨,在試婚紗的時候發(fā)現自己被綠了吟秩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片样勃。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖甘畅,靈堂內的尸體忽然破棺而出列另,到底是詐尸還是另有隱情芽腾,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布页衙,位于F島的核電站摊滔,受9級特大地震影響,放射性物質發(fā)生泄漏店乐。R本人自食惡果不足惜艰躺,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望眨八。 院中可真熱鬧腺兴,春花似錦、人聲如沸踪古。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伏穆。三九已至拘泞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間枕扫,已是汗流浹背陪腌。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留烟瞧,地道東北人诗鸭。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像参滴,于是被迫代替她去往敵國和親强岸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內容

  • 專業(yè)考題類型管理運行工作負責人一般作業(yè)考題內容選項A選項B選項C選項D選項E選項F正確答案 變電單選GYSZ本規(guī)程...
    小白兔去釣魚閱讀 8,985評論 0 13
  • 你的數學直覺怎么樣砾赔?你能憑借直覺蝌箍,迅速地判斷出誰的概率大青灼,誰的概率小嗎?下面就是 26 個這樣的問題妓盲。如果你感興趣...
    cnnjzc閱讀 6,883評論 0 12
  • 在C語言中,五種基本數據類型存儲空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 3,340評論 0 2
  • 選擇題部分 1.()部門負責日常監(jiān)督檢查工作,安全巡視的同時進行消防檢查,推動消防安全制度的貫徹落實杂拨。 A: 消防...
    skystarwuwei閱讀 15,188評論 0 3
  • 選擇題部分 1.(),只有在發(fā)生短路事故時或者在負荷電流較大時,變流器中才會有足夠的二次電流作為繼電保護跳閘之用。...
    skystarwuwei閱讀 12,896評論 0 7