BZOJ2287消失之物 揹包DP

2022-09-10 00:30:33 字數 1249 閱讀 1629

退揹包問題。

bzoj2287(許可權)time limit: 10 sec  memory limit: 128 mb

submit: 939  solved: 546

[submit][status][discuss]ftiasch 有 n 個物品, 體積分別是 w1

, w2

, ..., wn

。 由於她的疏忽, 第 i 個物品丟失了。 「要使用剩下的 n - 1 物品裝滿容積為 x 的揹包,有幾種方法呢?」 -- 這是經典的問題了。她把答案記為 count(i, x) ,想要得到所有1 <= i <= n, 1 <= x <= m的 count(i, x) **

第1行:兩個整數 n (1 ≤ n ≤ 2 × 103) 和 m (1 ≤ m ≤ 2 × 103),物品的數量和最大的容積。

第2行: n 個整數 w1

, w2

, ..., wn

, 物品的體積。

乙個 n × m 的矩陣, count(i, x)的末位數字。

3 21 1 2

1111

21如果物品3丟失的話,只有一種方法裝滿容量是2的揹包,即選擇物品1和物品2

解法設f[i][j]前i個物品j空間方案數

所以有f[i][j]=f[i-1][j]+f[i-1][j-w[i]]

減去i物品後有j的空間

初始化f[0][0]=1;

設c[i][j]為去掉i物品後,空間為j的方案數

當0=w[i],c[i][j]=f[n][j]-c[i][j-w[i]](減去沒有放進之前的方案數,因為f[n][j]把這之前放進去了)

#include#include#include#includeconst int maxn = 2005;

int n,m;

using namespace std;

int w[maxn],f[maxn][maxn];

int c[maxn][maxn];

int main()

f[0][0]=1;

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

}} for(int i=1;i<=n;i++) c[i][0]=1;

for(int i=1;i<=n;i++) }

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

printf("\n");

}}

BZOJ 2287 消失之物 揹包DP

本來在寫暴力,寫著寫著突然就想到了這種做法 希望今年noi pnoip noip 的時候也能這樣 先不考慮某個物品消失的情況,也就是樸素的01揹包 rep i,1,n repd j,m,v i f j add f j f j v i 然後考慮第i ii物品消失之後,對答案的影響就是多了沒消失之前的累...

BZOJ2287消失之物

dpdpdpdpdpdpdpdp 討厭dp 這道題看起來很難 實際上也很難 思路 我們要求拿走一件物品之後的方案數,那麼肯定會涉及到不拿走的情況,那麼不拿走的情況是什麼呢?用前i件物品拼成體積j的方案數,所以我們要先預處理一下這個初始陣列f i 也就是一件都不拿走的情況 之後呢?我們考慮如何轉移拿走...

BZOJ 2287 消失之物 線段樹分治 揹包

time limit 10 sec memory limit 128 mb submit 875 solved 499 submit status discuss ftiasch 有 n 個物品,體積分別是 w1 w2 wn 由於她的疏忽,第 i 個物品丟失了。要使用剩下的 n 1 物品裝滿容積為 ...