還是DP
令DP[i][j]表示看完j個位子情況下要到戰力i最少要多少錢,則題目就會變成求DP[0-5000][N]中花費少於M的max(i)
注意:因為題目規定每人的最大戰力是100,且最多也只能選50個,所以100*50=5000是這樣來的
初始化:
DP[0][0] = 0 // 看完0個位子,你有0點戰力,而且肯定沒花到錢
other DP[i][j] = NAN // 你沒有選手能選,再多錢也得不到這些戰力
設(選手的金額為v,戰力為w)
轉移式:當DP[i][j]<=M,則 DP[i+w][j+1] = min(DP[i+w][j],min(DP[i+w][j+1],DP[i][j]+v));
令S = N堆中最大戰力總和
複雜度:時間O(N*P*S)//4ms->比按照錢DP(M<=10000,S<=5000)大概快一點?,空間O(S*N)
狀態壓縮:一樣O(S*N)變成O(S)。