【題目】給定陣列arr,所有元素都為正數且不重複。每個值代表一種面值的貨幣,每種面值的貨幣可以使用任意張,再給定乙個整數aim代表要找的錢數,求換錢有多少種方法。
【舉例】
arr=[5,10,25,1] aim=0
返回1。組成0元的方法有一種,即所有貨幣都不用
arr=[3,5] aim=2
返回0。無法組成2.
arr=[5,10,25,1] aim=15
返回6。35,5+10,101+5,151,25+51,10+51
public
static
void
main
(string[
] args),15
));//6
system.out.
println
(coins1
(new
int,
2));
//0 system.out.
println
(coins2
(new
int,
15));
//6 system.out.
println
(coins2
(new
int,
2));
//0}
//方法一:暴力遞迴
public
static
intcoins1
(int
arr,
int aim)
return
process1
(arr,
0,aim);}
//arr:面值陣列,index:可以任意自由使用index及其之後所有的棧,aim:目標錢數,返回值:方法數
private
static
intprocess1
(int
arr,
int index,
int aim)
else
}return res;
}//方法二:利用map記憶化搜尋,防止重複計算
public
static
intcoins2
(int
arr,
int aim)
return
process2
(arr,
0,aim);}
//key:"index_aim",value:返回值
public
static hashmap
map =
newhashmap
<
>()
;private
static
intprocess2
(int
arr,
int index,
int aim)
else
else}}
map.
put(string.
valueof
(index)
+"_"
+string.
valueof
(aim)
,res)
;return res;
}//方法三:動態規劃
public
static
intcoins3
(int
arr,
int aim)
int[
] dp=
newint
[arr.length]
[aim+1]
;//dp[i][j]表示使用arr[0...i]組成j的方法數
for(
int i=
0;i)for
(int j=
0;arr[0]
*j<=aim;j++
)//求一般位置的dp[i][j],由兩者疊加
for(
int i=
1;ireturn dp[arr.length-1]
[aim]
;//arr[0...n]組成aim的方法數
}
【題目】給定乙個整型陣列arr,代表數值不同的紙牌排成一條線。玩家a和玩家b依次拿走每張紙牌,規定玩家a先拿,玩家b後拿,但是每個玩家每次只能拿走最左或最右的紙牌,玩家a和玩家b都絕頂聰明。請返回最後獲勝者的分數。
【舉例】
arr=[1,2,100,4]。
開始時玩家a只能拿走1或4。如果玩家a拿走1,則排列變為[2,100,4],接下來玩家b可以拿走2或4,然後繼續輪到玩家a。如果開始時玩家a拿走4,則排列變為[1,2,100],接下來玩家b可以拿走1或100,然後繼續輪到玩家a。玩家a作為絕頂聰明的人不會先拿4,因為拿了4之後玩家b將拿走100。所以玩家a會先拿1,讓排列變為[2,100,4],接下來玩家b不管怎麼選,100都會被玩家a拿走。玩家a會獲勝,分數為101。所以返回101。
arr=[1,100,2]。
開始時玩家a不管拿1還是2,玩家b作為絕頂聰明的人,都會把100拿走。玩家b會獲勝,分數為100。所以返回100。
public
class
cardsinline
return math.
max(
f(arr,
0, arr.length -1)
,s(arr,
0, arr.length -1)
);}public
static
intf
(int
arr,
int i,
int j)
return math.
max(arr[i]+s
(arr, i +
1, j)
, arr[j]+s
(arr, i, j -1)
);}public
static
ints
(int
arr,
int i,
int j)
return math.
min(
f(arr, i +
1, j),f
(arr, i, j -1)
);}public
static
void
main
(string[
] args)
; system.out.
println
(win1
(arr));
}}
什麼是無後效性?
某階段的狀態一旦確定,則此後過程的演變不再受此前各種狀態及決策的影響 現在有乙個四乘四的網格,左上角有乙個棋子,棋子每次只能往下走或者往右走,現在要讓棋子走到右下角 假設棋子走到了第二行第三列,記為s 2,3 如下圖,畫了兩條路線和一條不符合題意的路線,那麼當前的棋子 s 2,3 位置 怎麼走到右下...
賄賂FIPA 階段內轉移無後效
fipa 國際國際計畫協會聯合會 近期將進行投票,以確定下一屆ipwc 國際規劃世界盃 的主辦方。鑽石大陸的代表本內特希望通過以贈送鑽石買通國家的方式,獲得更多的投票。當然,他並不需要買通所有的國家,因為小國家會跟隨著他們附庸的大國進行投票。換句話說,只要買通了乙個大國,就等於獲得了它和它統治下所有...
動態規劃最優化原理與無後效性
上面已經介紹了動態規劃模型的基本組成,現在需要解決的問題是 什麼樣的 多階段決策問題 才可以採用動態規劃的方法求解?一般來說,能夠採用動態規劃方法求解的問題必須滿足.最優化原理和.無後效性原則。1 動態規劃的最優化原理。作為整個過程的最優策略具有如下性質 無論過去的狀態和決策如何,對前面的決策所形成...