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 - 4508acm.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件,那麼討論分兩個角度...