多維多重揹包問題 01揹包,完全揹包,多重揹包

2021-10-14 08:17:20 字數 2710 閱讀 8900

csdn-專業it技術社群-登入​blog.csdn.net有n件物品和乙個容量為v的揹包。第i件物品的費用是w[i],價值是v[i] ,求將哪些物品裝入揹包可使價值總和最大。

1.1空間優化

這要求在每次主迴圈中我們以 v ← v . . . 0 的遞減順序計算 f[v],這樣才能保證計算 f[v] 時 f[v-ci] 儲存的是狀態 f[i-1, v -ci] 的值。

1.2初始化

初始化的細節問題

我們看到的求最優解的揹包問題題目中,事實上有兩種不太相同的問法。有的題目 要求「恰好裝滿揹包」時的最優解,有的題目則並沒有要求必須把揹包裝滿。一種區別這兩種問法的實現方法是在初始化的時候有所不同。

如果是第一種問法,要求恰好裝滿揹包,那麼在初始化時除了 f[0] 為 0,其它 f[1..v ] 均設為 −∞,這樣就可以保證最終得到的 f[v ] 是一種恰好裝滿揹包的最優解。 如果並沒有要求必須把揹包裝滿,而是只希望**盡量大,初始化時應該將 f[0..v ] 全部設為 0。

這是為什麼呢?可以這樣理解:初始化的 f 陣列事實上就是在沒有任何物品可以放入揹包時的合法狀態。如果要求揹包恰好裝滿,那麼此時只有容量為 0 的揹包可以在什麼也不裝且價值為 0 的情況下被「恰好裝滿」,其它容量的揹包均沒有合法的解,屬於未定義的狀態,應該被賦值為 -∞ 了。如果揹包並非必須被裝滿,那麼任何容量的揹包都有乙個合法解「什麼都不裝」,這個解的價值為 0,所以初始時狀態的值也就全部為 0了。

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

for (int j = v; j >= w[i]; j--)

f[j] = max(f[j], f[j - w[i]] + v[i]);

hdu 1864 01揹包 最大報銷額

這道題需要注意的地方是cost和value是同乙個

//搞清楚揹包是什麼 這道題揹包是題目給定的報銷額度

#include #include #include using namespace std;

int dp[3000000];//由於每張發票不超過1000,最多30張,擴大100倍數後開這麼大即可

int main()

if (flag && a <= 60000 && b <= 60000 && a + b + c <= 100000)//按題意所說,必須滿足這些條件

}for (int i = 0; i < l;i++)

printf("%.2lfn",dp[sum]/100.0);

}return 0;

}

有 n 種物品和乙個容量為 v 的揹包,每種物品都有無限件可用。放入第 i 種物品的費用是 ci,價值是 wi。求解:將哪些物品裝入揹包,可使這些物品的耗費的費用總和不超過揹包容量,且價值總和最大。

優化:可以去除價效比低的物品

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

for (int j = w[i]; j <= v; j++)

f[j] = max(f[j], f[j - w[i]] + v[i]);

正序遍歷原因:

01揹包時,v逆序遍歷的目的在於降低空間複雜度,逆序可以work的原因在於逆序保證了計算f[i, v]時(兩種策略,1:選第i件物品;2:不選第i件物品),考慮第一種策略時,f[v-ci]代表f[i-1,v-ci],而不是f[i,v-ci],這樣就可以保證每件物品只選擇一次

而現在完全揹包的特點恰是每種物品可選無限件,所以在考慮「加選一件第

i 種物品」這種策略時,卻正需要乙個可能已選入第

i 種物品的子結果

f[i, v ci],所以就可以並且必須採用

v遞增的順序迴圈。這就是這個簡單的程式為何成立的道理。

dp[i][v]表示前i件物品恰放入乙個容量為v的揹包可以獲得的最大價值

在第二重迴圈,01 是倒著迴圈的,因為如果正著迴圈,有可能j-w[i]就有可能會是這次(第i次)迴圈裡面的,但因為每種物品只有乙個,根據01揹包的要求,j-w[i]只能是上次迴圈;如果倒序,那麼對於這個式子

for(i=0;i0;j--)

dp[j]=max(dp[j],dp[j-bag[i].v]*(1-bag[i].p));

對於第i重迴圈,當j走到某個值時,j-w[i]在本次迴圈中還沒有走到,所以只能是第i-1次迴圈中的,符合要求

而如果是完全揹包,則恰好要正著走,因為這樣才能夠反覆對乙個物品取多次

problem - 4508​acm.hdu.edu.cn

//揹包是卡路里限制:m

#includeconst int n=110;

using namespace std;

int dp[n*n*10];

struct nodenode[n];

int main()

if (num > 0)

}memset(maxv, 0, sizeof(maxv));//初始化

for (i = 0; i < count; ++i) // 使用01揹包

}printf("%dn", maxv[v]);

}return 0;

}

揹包問題 01揹包 完全揹包 多重揹包

01揹包和完全揹包的區別 01揹包的侷限在於每樣物品只有一種,每個物品都有乙個屬於自己的價值和重量,在給定的物品中選出揹包所能容納的最大重量,要求是價值最大 完全揹包與01揹包的不同在於完全揹包不限制每樣物品的個數,物品的價值和質量都與01揹包一樣,也同樣是求在給定大小的容量中,找出最大價值的選擇 ...

揹包問題(01揹包,完全揹包,多重揹包)

揹包問題 01揹包,完全揹包,多重揹包 近日為以下瑣事煩身 差不多要向學院提交專案申請了,本來是想做個多模式的im系統的,可是跟往屆通過審核的專案比起來,缺乏創新和研究價值,所以在文件上要多做手腳,花點心思。揹包問題,經典有揹包九講。不死族的巫妖王發工資拉,死亡騎士拿到一張n元的鈔票 記住,只有一張...

揹包問題 01揹包,完全揹包,多重揹包

有goods num件物品,max volume的最大裝載量,每種物品只有一件,每種物品都有對應的重量或者說體積volume i 價值value i 求解裝包的最大價值 假設目前已經有 i 1件物品裝在容量為 j 的揹包中,並且得到最大價值package i 1 j 當前裝第i件,那麼討論分兩個角度...