noip2005 一維採藥 恰 (揹包dp)

2021-06-23 05:30:25 字數 1799 閱讀 9270

描述

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

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

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

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

樣例輸入

70 3

71 100

69 1

1 2

樣例輸出

3

講解:對於乙個程式,追求的是高效與簡潔,所以優化是必須的。

我對於乙個程式的優化思路一般是這樣:演算法、空間與時間、細節。

所謂演算法,自然是想一下有什麼比當前更好地解題方法,這是在寫程式之前就應當解決的問題,當然不排除你在寫好程式後靈感迸發,想到更好的解題方法。

技巧:比如手寫讀入進行優化、內聯函式inline、位運算等等,主要是一些細節的地方,這要看個人的**功力如何了。同樣的一道題,同樣的乙個演算法,不同的人寫出來的程式效率有高有低,差距也主要體現在這些方面。

現在我們來講下如何如何把二維採藥優化成一維採藥。

首先,我們的這樣想,當我們求解第i層的資料時,只要保證第i-1層的資料不丟失就可以了也就是說我們只要能夠儲存兩層的資料就可以了。一種方法是用迴圈陣列的方式,定義陣列:f[2][maxn2],當列舉到第i個物品時,第i層的資料放在陣列f[i%2][maxn2]裡面。比如i==1時,資料放在陣列f[1][maxn2]裡面;i==2時,i%2==0,資料放在f[0][maxn2]裡面,而f[1][maxn2]自然就成為上一層的資料。這個對空間的優化是相當顯著地,把f[maxn1][maxn2]直接變成了f[2][maxn2]。

但這還不是最理想的,我們可以直接把f[maxn1][maxn2]變成f[maxn2]。我們用f[j]表示時間恰為 j 時,所能取得的最優值。當我們列舉到i,假設此時正在求解f[6],我們需要用帶到上一層的f[3]的值。如果是順序列舉的話,那麼第i-1層的f[3]的值很可能已經被第i層的f[3]的值所覆蓋了。但如果是倒序列舉呢?我們在求解f[6]時,f[7]、f[8]。。。f[t]都處理過了,而f[1]到f[5]還是沒有處理過的,他們此時的值就是i-1層的值,還沒有被第i層的資料所覆蓋。那麼求f[6]時,需要用到的i-1層f[3]的值就被完美的儲存下來了。

通過上面的講解,已經得到我們所要的了,一維揹包的關鍵就是倒序列舉。

迴圈陣列的程式演示:

#include#include#define maxn (1000+10)

using namespace std;

int t,m,f[2][maxn];

void work()

int main()

一維揹包程式演示:

#include#include#define maxn (1000+10)

using namespace std;

int t,m,f[maxn];

void work()

int main()

NOIP2005 採藥 解題報告

輸入檔案 medic.in 輸出檔案 medic.out 簡單對比 時間限制 1 s 記憶體限制 128 mb 辰辰是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了乙個難題。醫師把他帶到乙個到處都是草藥的山洞裡對他說 孩子,這個...

隨機化 NOIP 2005 採藥

0 1揹包問題 聽說貪心不能a?加個隨機化不就完了嘛 每次按照物品的價值和重量的比例從大到小排序,然後random十組數換一換,從前到後貪心拿 隨機20000次90分,50000次ac include include include include using namespace std int n...

NOIP2005 普及組複賽 第三題 採藥

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