拿硬幣 動態規劃

2022-07-15 19:06:11 字數 1071 閱讀 1708

question: 有10個硬幣,我和你按順序拿,每次可以拿1、2或者4個,拿到最後乙個硬幣的人輸,你怎麼確保自己可以獲勝

(這個問題的有乙個前提:雙方都想贏,並且當遇到能贏的情況時,他們能做出正確的決策而不是隨便決策)

這種問題,可以從簡單情況先想起,:

依此下來,我們是不是發現,對於固定的剩餘硬幣數量,先手還是後手直接可以決定你的輸贏。

其實,這是利用了動態規劃的思想。

我們假設f(i)表示結果,0表示輸,1表示贏。

當輪到你去取硬幣時,我們假設面前有i枚硬幣,你有三種取法(即取 1,2,4),當你取完就該對手取,如果說三種取法裡面只有有乙個取法能夠讓對手最後輸掉,那麼可以說你就贏了。

寫成狀態轉移方程:

f(i)=(f(i-1)==0 || f(i-2)==0 || f(i-4)==0 )

狀態推算:

f(0)=1

f(1)=0

f(2)=1

f(3)=1

f(4)=0

f(5)=1

f(6)=1

f(7)=0

f(8)=1

f(9)=1

f(10)=0

所以,對於10枚硬幣,先手拿不管怎麼拿必輸,因為後面的局面完全可以被後手的人掌握主動權,所以你要後手拿,然後你就可以根據**獲得制勝的策略。

10枚可以自己去推,我們簡單來推測下,為什麼7枚後手怎麼贏。

如果對方拿4枚,剩3枚,將i==3帶入公式,我們發現 f(3-1)==0,所以我們取 1 枚,剩下一枚,勝利!

如果對方拿2枚,剩下5枚,將i==5帶入公式,發現f(5-1)==0,所以我們取 1 枚,剩下 4 枚,我們在前面推過,面對4枚對方先手,他輸定了。

如果對方拿1枚,剩6枚,將i==6帶入公式,發現f(6-2)==0,所以取 2 枚,又剩下四枚,同樣的情況,你贏定了。

所以,7枚後手具體是這樣,10枚後手勝利也是這個道理。

動態規劃 硬幣問題

這是乙個固定重點的最長路和最短路問題,可用動態規劃問題來求解 代表硬幣總值,n代表硬幣總數,v陣列儲存硬幣各個面值,d代表從i出發到結點0的路徑的最長路徑長度或最短路徑長度 vis代表是否訪問過該結點 int n,s,v maxn d maxn vis maxn int dpmax int s re...

動態規劃 硬幣問題

2013 07 11 03 17 5610人閱讀收藏 舉報 演算法和資料結構學習 79 最少硬幣問題 假設有3種不同的硬幣,幣值分別是coinvalue 每一種硬幣的數量是有限的,分別是coinnum 給定乙個數值target 18,找出一種硬幣數最少的方法,輸出最少的硬幣數。思路 動態規劃。問題定...

動態規劃 分硬幣

解題心得 1 主要是找到狀態和狀態轉移方程,將大的問題縮小,一步步擴大得到最後的最優解。2 和最長上公升子串行相比,此問題不過是單位長度1變成了硬幣的分值,所以將大於或小於改為value的幾個值 3 可以想推出前面幾項來得出最後的狀態轉移公式。上面是在網上看到的一篇好文章,裡面有乙個湊硬幣的問題 如...