【問題描述】
辰辰是個天資聰穎的孩子,他的夢想是成為世界上最偉大的醫師。為此,他
想拜附近最有威望的醫師為師。醫師為了判斷他的資質,給他出了乙個難題。醫
師把他帶到乙個到處都是草藥的山洞裡對他說:「孩子,這個山洞裡有一些不同
的草藥,採每一株都需要一些時間,每一株也有它自身的價值。我會給你一段時
間,在這段時間裡,你可以採到一些草藥。如果你是乙個聰明的孩子,你應該可
以讓採到的草藥的總價值最大。」
如果你是辰辰,你能完成這個任務嗎?
【輸入檔案】
輸入檔案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 #include6using
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位的數字,用程式語言...