題面
原題過於繁複,這裡口述,多重揹包,多次詢問,每次詢問的揹包容量不一樣,並且每次詢問會規定乙個物品不能選(這個規定的物品每次詢問都會改變)。
題解首先考慮對詢問的兩個要求,容量不一樣很好處理,因為dp跑揹包的過程中本來就會記錄不同容量時的答案。
對於規定乙個物品不能選怎麼處理呢?不計算這乙個物品,需要計入答案的物品就被分成了編號比這個物品小的物品集合和編號比這個物品大的物品集合,可以直接雙向跑揹包,f表示從前到後的,g表示從後到前的,然後把兩個揹包合併。
因為這是個多重揹包,還需要套乙個二進位制拆分。
#include
using
namespace std;
namespace fastio
template
<
typename tn>
void
print
(tn a)};
using
namespace fastio;
int n,q;
const
int n=
2e4+5;
const
int m=
1e3+5;
int a,b,c;
int w[n]
,v[n]
,cnt;
int f[n]
[m],g[n]
[m];
int l[n]
,r[n]
;int
main()
if(c) v[
++cnt]
=c*a,w[cnt]
=c*b;
l[i]
=cnt+1;
r[i]
=l[i-1]
-1;}
for(
int i=
1;i<=cnt;i++
)for
(int j=
1;j)for
(int i=cnt;i>=
1;i--
)for
(int j=
1;j(j>=v[i]
) g[i]
[j]=
max(g[i+1]
[j],g[i+1]
[j-v[i]
]+w[i]);
else g[i]
[j]=g[i+1]
[j];
read
(q);
while
(q--
)return0;
}
題解 HEOI2013Eden 的新揹包問題
這題真的神奇了 蜜汁複雜度 應該是乙個比較連貫的思維方式 去掉乙個物品,那麼我們轉移的時候不考慮它就好了唄。考慮暴力 每一次都對剩餘的n 1個物品進行多重揹包轉移,獲得答案。既然可以優化,就說明一定有重複計算的地方 畫出一張方格圖,把不需要的格仔塗掉 我們突然發現每乙個可以有兩部分組成,而兩部分可以...
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 ...