動態規劃 面試題 組成銀幣的最小數目

2021-10-24 15:48:48 字數 1810 閱讀 9673

老四樣

例如 組成12 最小數目是 3 5+5+2=12;

複雜的寫法 (由於初始值我們定義太不具有靈活性了)(可以直接看靈活性的**

// 1.確定狀態

// dp[i] 代表組成 amount = i的最少銀幣數

// 2.狀態轉移方程dp[i]

// dp[i] = min(dp[i - 1], dp[i - 2], dp[i - 5]) + 1 注意了由於可能存在i-5<0 需要做點判斷,不然陣列越界挺麻煩的1

// 3.初始值

// 這個一定要注意了 dp[1] = 1 是因為我們coins中有1

// 更簡單的我們可以 vector dp(coins.size(), int_max)

// 初始值就是dp[coins[0]] = 1;

// 4.返回值 也就是求dp[amount]

**中邏輯賊複雜

class

solution

if(amount >= coins[0]

)else

//for (int i = 0;i < coins[0];i++)// 因為我們 vectordp(coins.size(),int_max); 所以可以省掉這些賦值了

//for

(int i= coins[0]

+1;i<=amount;i++

)int minvalue = int_max;

for(

int value : coins)}}

dp[i]

= minvalue ;

//為啥加1呢?因為我們加了乙個銀幣啊 }if

(dp[amount]

!= int_max)

return dp[amount]

;else

return-1

;}};

intmain()

;int amount =12;

cout

(coins, amount)

;}

由於上面初始值處我們不夠靈活,因此重新定義一下****具有靈活性

// 1.確定狀態

// dp[i] 代表組成 amount = i的最少銀幣數

// 2.狀態轉移方程dp[i]

// dp[i] = min(dp[i - 1], dp[i - 2], dp[i - 5]) + 1 注意了由於可能存在i-5<0 需要做點判斷,不然陣列越界挺麻煩的1

// 3.初始值

// 這個一定要注意了 dp[0] = 0 這點賊重要

//幫助我們下面的** 解決了以下幾個問題

1.比如說當amount=0時,返回0

2.amount// 4.返回值 也就是求dp[amount]

初始化定義合理之後的**

class

solution

dp[currentamount]

=min

(dp[currentamount]

, dp[leftamount]+1

);}}

return dp[amount]

== int_max ?-1

: dp[amount];}

};intmain()

;int amount =12;

cout

(coins, amount)

;}

是不是簡單多了,動態規劃初始值我們也值得我們思考思考。

動態規劃 面試題 組成銀幣最多可能數

動態規劃 組成銀幣的最多可能數 比如 vector coins int amount 8 顯然有三種 那麼問題來了怎麼求 老四樣 確定狀態 dp i 代表組成硬幣i的最大可能數 轉移狀態dp i for int coin coins 初始值 dp 0 1 這個初始化非常好 保證了dp coins i...

面試題,硬幣 動態規劃

題目描述 給定數量不限的硬幣,幣值為25分 10分 5分和1分,編寫 計算n分有幾種表示法。結果可能會很大,你需要將結果模上1000000007 示例1 輸入 n 5 輸出 2 解釋 有兩種方式可以湊成總金額 5 55 1 1 1 1 1 示例2 輸入 n 10 輸出 4 解釋 有四種方式可以湊成總...

LeetCode動態規劃 面試題17 16按摩師

乙個有名的按摩師會收到源源不斷的預約請求,每個預約都可以選擇接或不接。在每次預約服務之間要有休息時間,因此她不能接受相鄰的預約。給定乙個預約請求序列,替按摩師找到最優的預約集合 總預約時間最長 返回總的分鐘數。注意 本題相對原題稍作改動 示例 1 輸入 1,2,3,1 輸出 4 解釋 選擇 1 號預...