題解 HEOI2013Eden 的新揹包問題

2022-02-27 13:31:42 字數 1109 閱讀 3739

這題真的神奇了……蜜汁複雜度(`・ω・´)

應該是乙個比較連貫的思維方式:去掉乙個物品,那麼我們轉移的時候不考慮它就好了唄。考慮暴力:每一次都對剩餘的n - 1個物品進行多重揹包轉移,獲得答案。既然可以優化,就說明一定有重複計算的地方——畫出一張方格圖,把不需要的格仔塗掉——我們突然發現每乙個可以有兩部分組成,而兩部分可以遞推得到!那就很簡單了:a[i]表示選擇n ~ i 這些物品能獲得的最大值,b[i]表示選擇1~i的物品所能獲得的最大值。

答案就是兩部分的ab陣列暴力合併即可。

#includeusing

namespace

std;

#define maxn 1500

#define maxq 300015

int n, q, w[maxn], v[maxn], w[maxn * 10], v[maxn * 10

], t[maxn];

intcnt, l[maxn], r[maxn], a[maxn][maxn], b[maxn][maxn];

intm;

struct

queq[maxq];

intread()

while(c >= '

0' && c <= '

9') x = x * 10 + c - '

0', c =getchar();

return x *k;

}void

get_a()

if(s)

r[i] =cnt;

memcpy(a[i], a[i + 1], sizeof(a[i + 1

]));

for(int j = l[i]; j <= r[i]; j ++)

for(int k = m; k >= w[j]; k --)

a[i][k] = max(a[i][k], a[i][k - w[j]] +v[j]);

}}void

get_b()

}int

main()

get_a();

get_b();

for(int i = 1; i <= q; i ++)

return0;

}

HEOI2013 Eden 的新揹包問題

題面 原題過於繁複,這裡口述,多重揹包,多次詢問,每次詢問的揹包容量不一樣,並且每次詢問會規定乙個物品不能選 這個規定的物品每次詢問都會改變 題解首先考慮對詢問的兩個要求,容量不一樣很好處理,因為dp跑揹包的過程中本來就會記錄不同容量時的答案。對於規定乙個物品不能選怎麼處理呢?不計算這乙個物品,需要...

P4096 HEOI2013 Eden的博弈樹

乙個博弈樹,黑方先手。定義乙個最小的葉子節點集為黑胜狀態為黑方勝利集合,白色亦然。求所有既屬於黑方勝利集合有屬於白方勝利集合的點。設f i,0 1f fi,0 1 表示i ii子樹中的最小黑髮 白方勝利集和,然後可以根據這個求出所有的勝利集合點。時間複雜度o n o n o n include in...

Eden的新揹包問題 s 題解

題目鏈結 首先,50分做法 把原先的多重揹包二進位制拆分為01揹包 100分做法 考慮優化 設定狀態 f i j f i j f i j 表示到第 i ii 個時總體積為 j jj 的最大價值,那麼我們只要求 f d i 1 ei f d i 1 e i f di 1 e i 就可以把第 d id ...