題解 嚴酷的訓練 01揹包

2021-09-25 23:35:59 字數 1483 閱讀 5791

lj的朋友wky是一名神奇的少年,在同齡人之中有著極高的地位。。。

他的老師老王對他的程式水平讚嘆不已,於是下決心培養這名小子。

老王的訓練方式很奇怪,他會一口氣讓wky做很多道題,要求他在規定的時間完成。而老王為了讓自己的威信提高,自己也會把這些題都做一遍。

wky和老王都有乙個水平值,他們水平值的比值和做這些題所用時間的比值成反比。比如如果wky的水平值是1,老王的水平值是2,那麼wky做同一道題的時間就是老王的2倍。

每個題目有他所屬的知識點,這我們都知道,比如遞迴,動歸,最短路,網路流。在這裡我們不考慮這些事情,我們只知道他們分別是知識點1,知識點2……每乙個知識點有他對應的難度,比如動態規劃經常難於模擬。

而每乙個同一知識點下的題目,對於wky來講,都是一樣難的。而做出每一道題,老王都有其獨特的獎勵值。而獎勵值和題目的知識點沒有必然聯絡。

現在wky同學請你幫忙,計算在老王規定的時間內,wky所能得到最大獎勵值是多少 。

輸入檔案包括以下內容:

第一行:

wky的水平值和老王的水平值。

資料保證wky的水平值小於老王的水平值(哪怕它不現實),且老王的水平值是wky的水平值的整數倍。

第二行:

題目的總數m和知識點的總數n。

第三行:

n個整數。第i個整數表示 老王在做第i個知識點的題目所需的時間。

接下來有m行數每一行包括兩個整數p,q。p表示該題目所屬的知識點,q表示該題目對應的獎勵值。

最後一行是規定的時間。

輸出檔案只有一行,表示能到得到的最大獎勵值。

輸入 1

1 26 4

1 2 3 4

1 52 6

3 34 8

3 34 5

20輸出 1

22對於100%的資料,題目總數<=5000,規定時間<=5000

動態規劃01揹包

#include

using

namespace std;

int wky,lw,m,n,t[

6000

],tot,f[

6000];

struct kindpro[

6000];

intmain()

for(

int i=

1;i<=m;i++

) cin>>pro[i]

.zsd>>pro[i]

.jl;

cin>>tot;

for(

int i=

1;i<=m;i++

)for

(int j=tot;j>=t[pro[i]

.zsd]

;j--

) f[j]

=max

(f[j]

,f[j-t[pro[i]

.zsd]

]+pro[i]

.jl)

; cout<

}

P2430 嚴酷的訓練(01揹包)

題目背景 lj的朋友wky是一名神奇的少年,在同齡人之中有著極高的地位。題目描述 他的老師老王對他的程式水平讚嘆不已,於是下決心培養這名小子。老王的訓練方式很奇怪,他會一口氣讓wky做很多道題,要求他在規定的時間完成。而老王為了讓自己的威信提高,自己也會把這些題都做一遍。wky和老王都有乙個水平值,...

題解 01揹包

描述 乙個旅行者有乙個最多能裝 m 公斤的揹包,現在有 n 件物品,它們的重量分別是w1,w2,wn,它們的價值分別為c1,c2,cn,求旅行者能獲得最大總價值。輸入第一行 兩個整數,m 揹包容量,m 200 和n 物品數量,n 30 第2 n 1行 每行二個整數wi,ci,表示每個物品的重量和價值...

01揹包 題解

略略 我們的狀態陣列f i j f i j f i j 指在揹包有j jj的容量,只有前i ii件物品時的最大價值 由於每種物品只有選與不選兩種情況 所以如果容量允許,那麼f i j f i j f i j 只有兩種選擇 選擇第i ii件物品,或不選 狀態轉移方程見 然鵝,我們可以使用一些奇妙的手段...