題目大意:
你有乙個體積為n的箱子和兩種數量無限的寶物。寶物1的體積為s1,價值為v1;寶物2的體積為s2,價值為v2。輸入均為32位帶符號的整數。你的任務是最多能裝多少價值的寶物?
方法:其實也沒那麼不好想,關鍵是要冷靜下來一步步分析,如何降低列舉的數量。首先立馬想到的肯定是價效比高的先裝,但問題是會有剩餘空間,使得這樣的貪心策略並不是最優的。假設我們現在已經滿足s1*v2<=s2*v1,也就是說物品1價效比不會比物品2的小。那麼設最終物品1選n1件,物品2選n2件我們得到的等式就是ans=n1*v1+n2*v2。此時顯然有物品2的數量不會超過s1,(否則這s1個物品2的空間放物品1的價值為s2*v1更優),同時n2自身不會超過n/s2,對於s1<=s2的情況下顯然複雜度在sqrt(n)之下;對於s1>s2時顯然只能列舉物品1的數量了,首先由於物品1價效比高,所以我們不妨先全選了,然後再列舉要拿出多少物品1放物品2可取到最優解,那麼顯然同樣我們能拿出的物品數不會超過s2,同時總的拿出的物品數不會大於n/s1,故複雜度仍然在sqrt(n)之下。這樣問題就解決了。
本題有個有個降低列舉量的方法,即判斷s1,s2的大小關係後再進行列舉但當s1,s2都很小的則用到下面一種列舉方法:
對於寶物1和2,當所佔體積為s1*s2時,分別能夠提供的價值為s2*v1和s1*v2,我們便可以根據兩者的大小關係判斷選哪一種物品,如果s2*v1>=s1*v2,則我們可以得出寶物的數量最多為s1-1,因為如果我們選了s1件寶物2,則我們完全可以用s2件寶物1去代替,而且我們獲得價值會更大。因此每次可以列舉min(s1-1,cnt2)或者min(s2-1,cnt1)便可以得出答案。
另外書上提出了分類列舉的方法,我們可以根據s1和s2的範圍大小而採取不同的列舉方法。
————————————————
1 #include2 #include3 #include4using
namespace
std;
5int
main()
6//s1 must bigger than s2
19 printf("
case #%d:
",tt);
20long
long value=0;21
if(n/s2>=65536)22
28else
2933 printf("
%lld\n
",value);34}
35return0;
36 }
其實,當乙個乙個列舉的時候,可以這樣想,當我的某一種比較小的時候就可以列舉他。
但是要是s1,s2都很小的時候,列舉哪個都是超時的。
這個時候,可以這樣考慮,假設兩中體積相等(1寶貝s2個,2寶貝s1個),但是他有乙個價效比,價值分別是s2*v1 和 s1*v2;
那麼如果1寶貝價值大一點,那麼2寶貝肯定個數小於s1個,列舉這s1個就ok了
空間相同,想要裝入更多的價值寶貝,必須盡量裝入價效比高的寶貝
如何提高效率
如果問 你想不想使自己的收入加倍 我猜每個人的答案都是 yes 如果我繼續問 你相不相信現在你的收入會加倍 我想有一些人可能會沒把握,有一些人認為不太可能,我告訴各位 你們每個人的收入一定會加 倍 因為按照每年物價增長率及通貨膨脹的正常速度,20年後你的收入一定會加倍。但是如果你希望,提前在5年內 ...
Python 提高效率
最近師兄給了小任務,算乙個p值。任務詳情是這樣的 第一步,有基因集a,23個元素,基因集b,451個元素,共有23 451 9922個組合 當然你要考慮去重 看在ppi資料庫 145萬多行資料 中出現的組合總個數 觀察值 第二步,然後再以hg19中基因為背景基因集,放回隨機抽取23個基因構成基因集c...
如何提高效率
在提高班學習有很長的一段時間了,學習的收穫中有一點是非常的明顯,那就是自己的效率明顯的比原來高出許多,現在就按照自己的切身體會來總結一下如何提高自己效率.1 目標 必須要有目標,沒有目標和方向效率會大大的折扣.當然不僅僅是學習,更是生活,事業,和人的整個一生.這點公尺老師非常的重視,每個學習階段都給...