題目
題意簡潔明瞭,就是做乙個01揹包,但是揹包的容量\(w\)非常大,並且給出的物品的體積都能表示成\(a\times 2^b,a\leq 10,b\leq 30\)
顯然這個\(a\)拿來做揹包的體積非常合適,於是我們按照\(b\)分類,設\(dp_\)表示只使用\(a\times 2^i\)形式的物品,湊出\(j\times 2^i\)體積的最大價值
其實就是對每一種\(b\)單拎出來做乙個01揹包
考慮合併掉\(dp\)陣列,設\(f_\)表示合併出乙個形如\(j\times2^i\)並且後\(i-1\)位都不超過\(w\)後\(i-1\)位的最大價值
不難發現我們的答案就是\(\max(f_,f_)\)
合併的時候也大力轉移,我們列舉一下\(i-1\)位給\(i\)進多少位,則有
\[f_=\max_f_}+dp_
\]**
#include#define re register
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read()
int a[31][105],b[31][105];
int dp[31][1005],f[31][2005];
int sum[31],cnt[31],n,m,bit[31],tot,s[31];
int main()
int ans=max(f[tot][0],f[tot][1]);
for(re int i=0;ians=max(ans,max(f[i][0],f[i][1]));
printf("%d\n",ans);
} return 0;
}
HNOI2007 夢幻島寶珠
題解 一道比較好的題目 首先比較顯然的就是我們要按照a 2 b的b的順序來列舉 那麼狀態f i j 表示當前在b,用了a 2 b 剛開始沒想到怎麼不同層之間搞 看了題解發現非常簡單 由於每一層到最後一層有用的二進位制位至少時從自己的二進位制位開始 所以我們可以捨棄那些沒用的二進位制位 maxa f ...
HNOI2007 夢幻島寶珠 DP 折半
description 給你n顆寶石,每顆寶石都有重量和價值。要你從這些寶石中選取一些寶石,保證總重量不超過w,並輸出最大的總價值。sample input 4 10 8 95 8 4 62 5 4 13 8 95 8 4 62 5 16 75594681 393216 5533 2 77 3276...
P3188 HNOI2007 夢幻島寶珠
傳送門 注意到 a,b 不大 考慮對每乙個 a 2 b 的 b 分別揹包 設 f i j 表示只考慮 b i 的物品時,容量為 j sum a 的最大價值 這個就是普通的 01 揹包 考慮把 f i j 之間合併起來,為了得到容量為 w 時的答案,我們要把 f 的含義稍微變化一下 變成 f i j ...