試題 演算法訓練 入學考試

2021-10-19 17:25:49 字數 1403 閱讀 5035

問題描述

辰辰是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了乙個難題。醫師把他帶到乙個到處都是草藥的山洞裡對他說:「孩子,這個山洞裡有一些不同的草藥,採每一株都需要一些時間,每一株也有它自身的價值。我會給你一段時間,在這段時間裡,你可以採到一些草藥。如果你是乙個聰明的孩子,你應該可以讓採到的草藥的總價值最大。」

如果你是辰辰,你能完成這個任務嗎?

輸入格式

第一行有兩個整數t(1 <= t <= 1000)和m(1 <= m <= 100),用乙個空格隔開,t代表總共能夠用來採藥的時間,m代表山洞裡的草藥的數目。接下來的m行每行包括兩個在1到100之間(包括1和100)的整數,分別表示採摘某株草藥的時間和這株草藥的價值。

輸出格式

包括一行,這一行只包含乙個整數,表示在規定的時間內,可以採到的草藥的最大總價值。

樣例輸入

70 3

71 100

69 1

1 2樣例輸出

3思路:

這道題就是乙個01揹包題,動態規劃 dp[j]表示當前剩餘容量為j揹包的最優情況。

我們先選第乙個物品來求最優解,然後不斷的新增物品來看當前為t的最優解就可以得到最大價值了。我們知道當前物品容量大於當前剩餘容量是不可以裝的所以我們就讓剩餘容量大於等於當前物品容量。我們有2種取最優解第1種就是本身的值,第二種就是當前容量減去物品容量的最優解加當前物品的價值就是一種取法,然後我們的轉移方程就是:max(dp[j-k[i][0]]+k[i][1],dp[j])

程式:

t,n=

map(

int,

input()

.split())

k=[]for i in

range

(n):

list

(map

(int

,input()

.split())

))#存入輸入

dp=[

0for i in

range

(t+2)]

#初始化

for i in

range

(n):

#當前的物品

for j in

range

(t,k[i][0

]-1,

-1):

#當前的剩餘容量

dp[j]

=max

(dp[j-k[i][0

]]+k[i][1

],dp[j]

)#和之前的最優解相比較在和減去當前容量的最優解加當前的價值相互比較取最優解

print

(dp[t]

)

演算法訓練 入學考試

問題描述 辰辰是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了乙個難題。醫師把他帶到乙個到處都是草藥的山洞裡對他說 孩子,這個山洞裡有一些不同的草藥,採每一株都需要一些時間,每一株也有它自身的價值。我會給你一段時間,在這段時間裡...

演算法訓練 入學考試

問題描述 herbal medicine 辰辰是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了乙個難題。醫師把他帶到乙個到處都是草藥的山洞裡對他說 孩子,這個山洞裡有一些不同的草藥,採每一株都需要一些時間,每一株也有它自身的價值...

演算法訓練 入學考試 藍橋杯

時間限制 1.0s 記憶體限制 256.0mb 辰辰是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了乙個難題。醫師把他帶到乙個到處都是草藥的山洞裡對他說 孩子,這個山洞裡有一些不同的草藥,採每一株都需要一些時間,每一株也有它自身...