類似於線段樹分治,在每個節點預處理[l,
mid]
,[mi
d+1,
r]
[l,mid],[mid+1,r]
[l,mid
],[m
id+1
,r]的揹包,然後詢問即可
一般**就類似下面的寫法,但是此題有點卡空間於是稍微優化了一下空間。
時間複雜度o
o\o
#include
using
namespace std;
using ll=
long
long
;constexpr
int n=
40010
;int n,m,q;
int v[n]
,w[n]
;ll fl[n]
[205
],fr[n]
[205];
int b[
200010];
ll ans[
200010];
struct node
;void
solve
(int l,
int r,vector
&vec)
vector vl,vr;
int mid=l+r>>
1,idx=0;
for(
int i=
0;isize()
;i++
)for
(int i=l;i<=r;i++
)for
(int j=
0;j<=m;j++
) fl[i]
[j]=fr[i]
[j]=-1
;for
(int j=
0;j<=m;j++
) fl[mid+1]
[j]=fr[mid]
[j]=0;
for(
int i=mid;i>=l;i--
)for
(int j=
0;j<=m;j++
)for
(int i=mid+
1;i<=r;i++
)for
(int j=
0;j<=m;j++
)for
(int i=
1;i<=idx;i++)if
(vl.
size()
)solve
(l,mid,vl);if
(vr.
size()
)solve
(mid+
1,r,vr);}
intmain()
);}solve(1
,n,vec)
;for
(int i=
1;i<=q;i++
) cout<<<
'\n'
;return0;
}
優化空間後**
#include
using
namespace std;
using ll=
long
long
;constexpr
int n=
40010
;int n,m,q;
int v[n]
,w[n]
;ll f[n]
[205];
int b[
200010];
ll ans[
200010];
struct node
;void
solve
(int l,
int r,vector
&vec)
vector vl,vr;
int mid=l+r>>
1,idx=0;
for(
int i=
0;isize()
;i++
)for
(int i=l;i<=r;i++
)for
(int i=mid-
1;i>=l;i--
)for
(int j=
0;j<=m;j++
)for
(int i=mid+
2;i<=r;i++
)for
(int j=
0;j<=m;j++
)for
(int i=
1;i<=idx;i++)if
(vl.
size()
)solve
(l,mid,vl);if
(vr.
size()
)solve
(mid+
1,r,vr);}
intmain()
);}solve(1
,n,vec)
;for
(int i=
1;i<=q;i++
) cout<<<
'\n'
;return0;
}
揹包問題 完全揹包 P1616 瘋狂的採藥
p1616 瘋狂的採藥 和01揹包相比,每種物品的數量變得無限了,但還是有乙個 條件,就是不能超過揹包總量的,假設取 k 件物品 i k s i c,這樣就轉化成多重揹包了。但是,在二維層面是很容易簡化的。for i 1 i n i j 這層迴圈,從小到大計算,那麼就有 f p v i f i p ...
洛谷P1782 旅行商的揹包 多重揹包
小s堅信任何問題都可以在多項式時間內解決,於是他準備親自去當一回旅行商。在出發之前,他購進了一些物品。這些物品共有n種,第i種體積為vi,價值為wi,共有di件。他的揹包體積是c。怎樣裝才能獲得盡量多的收益呢?作為一名大神犇,他輕而易舉的解決了這個問題。然而,就在他出發前,他又收到了一批奇貨。這些貨...
hdu5616(理解01揹包很好的題目)
這題一看到不就是01揹包嗎?直覺想到對不對!有木有!然而,01揹包我們都是正的掃一遍,這裡需要反的再掃一遍,而且揹包裡面不一定非要儲存背的物體的重量,還可以是記錄這個揹包有沒有用過哈 首先要正的掃一遍,就是物品那端不放砝碼,只在另一端放砝碼,看有多少重量可以放到 這裡記錄的是該重量能否被訪問到,所以...