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件物品,或不選 狀態轉移方程見 然鵝,我們可以使用一些奇妙的手段...