1. 程式人生 > >基本分組揹包

基本分組揹包

有n件物品和一個容量為v的揹包。第i件物品的費用是c[i],價值是w[i]。這些物品被劃分為幾組,每組中的物品互相沖突,最多選一件。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大.

意思是每組物品有幾種決策:是選擇本組的某一件,還是一件都不選。
f[k][v]表示前k組物品花費費用v能取得的最大價值,則有:

f[k][v]=max{f[k-1][v],f[k-1][v-c[i]]+w[i]}//i是列舉第k組中的物品


基本程式碼:
for(int k=1;k<=n;k++)
   for(int j=v;j>=0;j--)//列舉錢
       for(int i=a[k][1];i<=gs[k];i++) //列舉第k組中的物品
           f[v]=max(f[v],f[v-c[a[k][i]]]+w[a[k][i]]);

ps:

列舉物品的迴圈必須放在內層,這樣才能保證每一組內的物品最多隻有一個會被新增到揹包中。