喬治采藥
【問題描述】
喬治是只天資聰穎的小豬,他的夢想是成為世界上最偉大的醫師。為此,他去找她的奶奶—豬小妹大陸上最有威望的醫師。豬奶奶為了判斷喬治的資質,給他出了一個難題。豬奶奶把他帶到一個到處都是草藥的山洞裏對他說:“喬治,這個山洞裏有一些不同的草藥,采每一株都需要一些時間,每一株也有它自身的價值。我會給你一段時間,在這段時間裏,你可以采到一些草藥。如果你是一只聰明的小豬,你應該可以讓采到的草藥的總價值最大。”
喬治當然能夠出色地解決這個問題。如果你是喬治,你能完成這個任務嗎?
【輸入文件】
輸入文件medic2.in 的第一行有兩個整數N和M,用一個空格隔開M 代表總共能夠用來采藥的時間,N代表山洞裏的草藥的數目。接下來的N 行每行包括兩個的整數,分別表示采摘某株草藥的時間Ti和這株草藥的價值Vi。
【輸出文件】
輸出文件medic2.out 包括一行,這一行只包含一個整數,表示在規定的時間內,可以采到的草藥的最大總價值。
【樣例輸入】
3 90
10 10
8 1
1 2
【樣例輸出】
3
【數據規模】
對於50%的數據,N、M <= 1000;
對於全部的數據,N、M<=100000Ti Vi<=10
【胡亂分析】
這道題乍一看和佩奇采藥那道題挺像,但是為啥人喬治采藥就放在了第三道題的位置上了?答案很簡單,從數據規模上可以看出,這是一道多重背包問題。現在我們讓它現一下原型:
有N種物品和一個容量為V的背包。第i種物品最多有n[i]件可用,每件費用是w[i],價值是c[i]。求解將哪些物品裝入背包可使這些物品的費用總和不超過背包容量,且價值總和最大。 對於第i種物品,一共有n+1種選擇:不選、選1件、選2件。。。。選n件。代碼如下
f[j]=max(f[j],f[j-k*v[i]+k*w[i];//k為選擇物品的件數
那麽對於這個問題就是在01背包的基礎上,又多了一層循環,來枚舉一個物品選擇的件數。
但是三重循環時間復雜度略高,這時我們對其進行二進制優化,轉化成01背包問題。但是對於2進制,我坦白的承認我 還 不 會 !!!所以請您去看巨佬們的題解。
喬治采藥