暴力:暴力列舉少了哪個,下面套乙個01揹包
f[i][j]表示到了i物品,用了j容量的揹包時的方案數,f[i][j]=f[i-1][j]+f[i-1][j-w[i]]o(n^3)
優化:不考慮消失的,先跑乙個01揹包,
定義g[i][j]表示i消失時,容量為j的方案數,g[i][j]=f[n][j]-不合法的
逆著過來就是g[i][j]-=g[i][j-w[i]
1 #include2 #include3 #include4view codeusing
namespace
std;
5const
int maxn=2005;6
#define r register
7int
w[maxn],n,m;
8int
f[maxn][maxn],g[maxn][maxn];
9int
main()
1020
for(int i=1;i<=n;i++)
21for(int j=0;j<=m;j++)//
第i個物品不選時,揹包容量為j,若選i,則由g[i][j-w[i]](表示 不選i,揹包有j-w[i])轉移顯然要減去
25for(int i=1;i<=n;i++)
30 }
洛谷P4141 消失之物 題解 揹包問題擴充套件
題目大意 有 n 件物品,求第 i 件物品不能選的時候 i 從 1 到 n 0 1揹包方案數。解題思路 遍歷每一遍不選的物品,然後對剩餘的物品求01揹包方案數。時間複雜度為 o n 2m 由於這裡每一件物品的價值和時間相同,所以可以定義狀態 f i 表示填滿體積 i 的方案數。則有狀態轉移方程 f ...
P4141 消失之物
ftiasch 有 n 個物品,體積分別是 w1,w2,wn。由於她的疏忽,第 i 個物 品丟失了。要使用剩下的 n 1 物品裝滿容積為 x 的揹包,有幾種方法 呢?這是經典的問題了。她把答案記為 count i,x 想要得到所有1 i n,1 x m的 count i,x n,m 3000 題解 ...
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物品消失之後,對答案的影響就是多了沒消失之前的累...