假設你是一支棒球大聯盟球隊的總經理。在賽季休季期間,你需要簽入一些自由球員。球隊老闆給你的預算為x美元,你可以使用少於x美元來簽入球員,但如果超支,球隊老闆就會解雇你。
你正在考慮在n個不同位置簽入球員,在每個位置上,有p個該位置的自由球員供你選擇。由於你不希望任何位置過於臃腫,因此每個位置最多簽入一名球員(如果在某個特定位置上你沒有簽入任何球員,則意味著計畫繼續使用現有球員)。
為了確定一名球員的價值,你決定使用一種稱為「vorp」,或「球員替換價值」的統計評價指標。球員的vorp值越高,其價值越高。但vorp值高的球員簽約費用並不一定比vorp值低的球員高,因為還有球員價值之外的因素影響簽約費用。
對於每個可選擇的自由球員,你知道他的三方面資訊:
1.他打哪個位置。2.他的簽約費用。3.他的vorp。
設計乙個球員選擇演算法,是的總簽約費用不超過x美元,而球員的總vorp最大。你可以假定每位球員的簽約費用是10萬美元的整數倍。演算法應輸出簽約球員的總vorp值,總簽約費用,以及球員名單。分析演算法的時間和空間複雜度。
思考與分析:這明顯是乙個改進的揹包問題。不超過x美元,相當於揹包的總容量。總vorp最大,相當於揹包的總價值。每位球員的簽約費用,相當於每件物品的重量。現在我們要給出在簽約費用不超過x美元的前提下使總價值最大的球員選擇方案。以0-1揹包為背景的動態規劃演算法,我們可以給其改進一下,這裡每個位置(相當於每件物品)有p個球員。那麼我們要多加乙個迴圈用於求在找到最大價值方案的前提下還要先找出p個球員之中的價值最大的那個。那麼我們現在可以刻畫出遞迴式。
遞迴式為:
**如下
#include #include using namespace std;
#define n 10
struct player
;void free_agent_vorp(struct player **p,int n,int p,int x)
who=new int*[n+1];
for ( i=0;i<=n;i++)
//二維陣列v[i][j]代表位置i的不超過總費用j時的總價值(相當於揹包的總價值)
//二維陣列who[i][j]代表選擇位置i的總費用不超過j的球員
for (int x=0;x<=x;x+=10)//10=10萬}}
//對剩下的n-1個位置進行放置。
for ( i=n-1;i>=1;i--)
}} }
cout<
amt-=p[i][k].cost;//簽約了乙個球員後,剩餘的總費用。(相當於剩餘的總重量)
} }cout
動態規劃之自由組合問題
1.有一定的錢,去買一些東西,求最多有多少買種東西的方案?2.如果一種物品最多能買一次,則是01揹包變形型別 3.如果乙個物品能多次購買,則是完全揹包變形型別 4.每一種買東西的方案必須要把錢剛好花完。1.神奇的口袋 2.買書 第一道題裡 錢 是固定的,輸入 東西的 第二道題裡 東西的 是固定的,輸...
動態規劃 通向自由的鑰匙
通向自由的鑰匙 key.pas c cpp 通向自由的鑰匙被放n個房間裡,這n個房間由n 1 條走廊連線。但是每個房間裡都有 特別的保護魔法,在它的作用下,我無法通過這個房間,也無法取得其中的鑰匙。雖然我可 以通過消耗能量來破壞房間裡的魔法,但是我的能量是有限的。那麼,如果我最先站在 1 號房間 1...
LeetCode 自由之路(動態規劃 回溯法)
輸入 ring godding key gd 輸出 4 解釋 對於 key 的第乙個字元 g 已經在正確的位置,我們只需要1步來拼寫這個字元。對於 key 的第二個字元 d 我們需要逆時針旋轉 ring godding 2步使它變成 ddinggo 當然,我們還需要1步進行拼寫。因此最終的輸出是 4...