老四樣
例如 組成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 號預...