採藥公升級版

2022-05-09 15:39:13 字數 1659 閱讀 8303

【問題描述】

辰辰是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他

想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了乙個難題。醫

師把他帶到乙個到處都是草藥的山洞裡對他說:「孩子,這個山洞裡有一些不同

的草藥,採每一株都需要一些時間,每一株也有它自身的價值。我會給你一段時

間,在這段時間裡,你可以採到一些草藥。如果你是乙個聰明的孩子,你應該可

以讓採到的草藥的總價值最大。」

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

【輸入檔案】

輸入檔案medic2.in 的第一行包含兩個正整數n,m。m 表示總共能夠用來

採藥的時間,n 代表山洞裡的草藥的數目。接下來的n 行每行包括兩個的整數,

分別表示採摘某株草藥的時間ti 和這株草藥的價值vi。

【輸出檔案】

輸出檔案為medic2.out,僅包含乙個整數表示規定時間內可以採到的草藥

的最大總價值。

【輸入樣例】

3 910 10

8 11 2

【輸出樣例】

3【資料規模和約定】

50%的資料中n,m ≤ 1000;

100%的資料中n,m ≤ 100000,ti,vi ≤10。

分析:這道題乍一看就是乙個01揹包,然而看看資料範圍發現會tle。那怎麼辦呢?這是又在資料範圍裡看到了乙個希望:ti,vi ≤10。這就說明最多有100種物品,因此一定會有物品重複。那麼這就轉化為乙個多重揹包了。用二進位制優化,這道題就解了。

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

7 typedef long

long

ll;8

const

int maxn = 1e5 + 5; 9

intt, m;

10int

c[maxn], v[maxn], dp[maxn];

11ll read()

1219

while(ch >= '

0' && ch <= '9'

)2023if(last == '

-') ans -=ans;

24return

ans;25}

26int vis[15][15], num = 0;27

void hebing(int c, int v,int gs) //

二進位制優化

2837 c[++num] = gs *c;

38 v[num] = gs *v;

39return;40

}41void

dp()

4248

for(int i = 0; i <= 10; ++i)

49for(int j = 0; j <= 10; ++j)

50if

(vis[i][j])

51for(int i = 1; i <= num; ++i) //

按01揹包做

5255 printf("

%d\n

", dp[t]);56}

57int

main()

58

介面公升級版

介面公升級版 假設乙個介面由2w個子類實現它 假如在介面內加乙個方法 那麼按照定義就要在這所有的子類裡面都實現 所以我們引入新概念 介面裡可以定義普通方法 即這個普通方法可以不被實現 普通方法就要用default實現 介面還可以實現static方法 呼叫是直接由介面.方法名呼叫 inte ce im...

約瑟夫問題公升級版

編號為1 n的n個人按順時針方向圍坐一圈,每人持有乙個密碼 正整數,可以自由輸入 開始人選乙個正整數作為報數上限值m,從第乙個人按順時針方向自1開始順序報數,報道m時停止報數。報m的人出列,將他的密碼作為新的m值,從他順時針方向上的下乙個人開始從1報數,如此下去,直至所有人全部出列為止。includ...

階乘計算公升級版

本題要求實現乙個列印非負整數階乘的函式。void print factorial const int n 其中n是使用者傳入的引數,其值不超過1000。如果n是非負整數,則該函式必須在一行中列印出n 的值,否則列印 invalid input 1000的階乘結果是乙個接近3000位的數字,用程式語言...