退揹包問題。
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 物品裝滿容積為 ...