[C++]面試題之動(dòng)態(tài)規(guī)劃類問題

  • 問題問法:
    Q:現(xiàn)在有4種硬幣,面值分別為1昌腰、2开伏、5、10分遭商,如果要組成一毛3可以有多少種組法?
    Q:一個(gè)人上臺(tái)階的時(shí)候一次可以跨1固灵、2、5級(jí)臺(tái)階劫流,如果臺(tái)階有13級(jí)他有多少種走法?
    實(shí)質(zhì)都是求用n種數(shù)字組合成數(shù)值m

  • 燒腦預(yù)警:
    因?yàn)槲冶磉_(dá)不太好巫玻,大家可能看的不是很懂,可以再看看
    https://blog.csdn.net/u013074465/article/details/48575585
    雖然我看這個(gè)文章時(shí)候也花了點(diǎn)時(shí)間想一些細(xì)節(jié)祠汇,畢竟這個(gè)問題真的三言兩語講不清楚
    如果往下的時(shí)候看不懂仍秤,回到下一行來看看這段話:
    ===========================================================================
    題目的問題實(shí)際上就是求dp[m][sum],即用前m種硬幣(所有硬幣)構(gòu)成sum的所有組合數(shù)可很。
    設(shè)最后一種硬幣的數(shù)量為xn诗力。
    當(dāng)xn=0時(shí),有多少種組合呢我抠? 實(shí)際上就是前i-1種硬幣組合sum苇本,有dp[i-1][sum]種导坟!
    xn = 1 時(shí)呢,有多少種組合圈澈? 實(shí)際上是用前i-1種硬幣組合成(sum - Vm)的組合數(shù)惫周,有dp[i-1][sum -Vm]種;
    xn = 2 呢, dp[i-1][sum - 2 * Vm]種康栈,等等递递。
    所有的這些情況加起來就是我們要求的dp[i][sum]。
    ===========================================================================

  • 動(dòng)態(tài)規(guī)劃的概念:
    將一個(gè)多階段問題轉(zhuǎn)化成一系列的單階段問題

  • 轉(zhuǎn)化講解:
    用上面的問題做例子啥么,用4種數(shù)字相加成目標(biāo)值登舞,多階段的解法無非就是暴力枚舉多層for循環(huán)鑲嵌,
    這樣很復(fù)雜也不是個(gè)聰明方法悬荣,但是把這一層一層for簡化一下菠秒,轉(zhuǎn)換一下思路
    比如你要求用2種數(shù)字組合成一個(gè)數(shù)值13(假設(shè)數(shù)字為1和2),這里把用i種數(shù)值的組合成數(shù)值j的情況設(shè)為數(shù)組dp[i][j];
    那么其實(shí)就是
    dp[2][13]=dp[1][13-0x2]+dp[1][13-1x2]+dp[1][13-2x2]+...+dp[1][13-6x2];
    為什么是這樣呢,我來解釋下里面的意思氯迂,dp[1][13-0x2]這個(gè)就是當(dāng)數(shù)字2的個(gè)數(shù)為0的時(shí)候的組合數(shù)践叠,
    那么dp[1][13-1x2]就是當(dāng)數(shù)字2的數(shù)量為1的時(shí)候的組合數(shù),為什么到6就停了呢?因?yàn)橛?去組合的話最多
    只能用6個(gè)2嚼蚀,7個(gè)的話2x7=14已經(jīng)超過目標(biāo)數(shù)值了禁灼,這里就是把多個(gè)階段給分解成了一個(gè)階段,也就將
    求法隱式地轉(zhuǎn)成了利用數(shù)字2個(gè)數(shù)組合地可能性求答案轿曙。
    簡化了一層for的求值:

    int target=13;
    int last_coin=2;
    for(int k=0;k<=target/last_coin;++k)
    {
        dp[last_coin][target]+=dp[last_coin-1][target-k*last_coin];
    }

看完代碼就有人會(huì)問弄捕,那d[1][target-k*last_coin]的值從哪里來?那當(dāng)然是根據(jù)d[0][target-k * last_coin]的值累積來的,那么d[0][target-k * last_coin]的值又從哪里來?朋友們,0的時(shí)候是在求問題“用0種硬幣求目標(biāo)數(shù)值可能性有多少種”的答案了导帝,答案當(dāng)然是1守谓,你要用0種硬幣求一個(gè)數(shù)值,那么所有的組合只有一種您单,數(shù)值是0斋荞,各種硬幣的數(shù)量也為0.

  • 代碼
#include<iostream>
using namespace std;
int main(){
    int coins[4]={1,2,5,10};//硬幣種類數(shù)組
    const int coin_kinds_num=sizeof(coins)/sizeof(coins[0]);
    const int total=13;//要組合成的目標(biāo)數(shù)值
    /*以上為條件:硬幣種類和要組合成的目標(biāo)數(shù)值*/
    int dp[coin_kinds_num][total+1];
    for(int i=0;i<coin_kinds_num;i++)
    {
        dp[i][0]=1;
    }
    /*以上為初始化特殊情況(后面計(jì)算要用)當(dāng)要組合成的目標(biāo)數(shù)值為0的時(shí)候,只有一種情況睹限,那就是各種硬幣的搭配都是0個(gè)*/
    for(int i=1;i<=coin_kinds_num;++i)//這里i從1開始,因?yàn)橐呀?jīng)跳過了特殊情況譬猫,而且也不會(huì)組合目標(biāo)數(shù)值0
    {
        for(int j=1;j<=total;++j)//
        {
            dp[i][j]=0;//數(shù)組未初始化的時(shí)候值是隨機(jī)數(shù)讯檐,這里初始化一下
            for(int k=0;k<=j/coins[i-1];++k)//這里的j/coins[i-1]是指用i種硬幣去組合目標(biāo)時(shí),最多可以放多少個(gè)coins[i-1]這種硬幣
            {
                dp[i][j]+=dp[i-1][j-k*coins[i-1]];
            }
        }
    }
    return 0;
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末羡疗,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子别洪,更是在濱河造成了極大的恐慌叨恨,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挖垛,死亡現(xiàn)場離奇詭異痒钝,居然都是意外死亡秉颗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門送矩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚕甥,“玉大人,你說我怎么就攤上這事栋荸」交常” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵晌块,是天一觀的道長爱沟。 經(jīng)常有香客問我,道長匆背,這世上最難降的妖魔是什么呼伸? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮钝尸,結(jié)果婚禮上括享,老公的妹妹穿的比我還像新娘。我一直安慰自己珍促,他們只是感情好奶浦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著踢星,像睡著了一般澳叉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沐悦,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天成洗,我揣著相機(jī)與錄音,去河邊找鬼藏否。 笑死瓶殃,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的副签。 我是一名探鬼主播遥椿,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼淆储!你這毒婦竟也來了冠场?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤本砰,失蹤者是張志新(化名)和其女友劉穎碴裙,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡舔株,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年莺琳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片载慈。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惭等,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出办铡,到底是詐尸還是另有隱情咕缎,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布料扰,位于F島的核電站凭豪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏晒杈。R本人自食惡果不足惜嫂伞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拯钻。 院中可真熱鬧帖努,春花似錦、人聲如沸粪般。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亩歹。三九已至匙监,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間小作,已是汗流浹背亭姥。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留顾稀,地道東北人达罗。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像静秆,于是被迫代替她去往敵國和親粮揉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容