分组背包问题

问题:有N件物品和一个容量为V的背包。第i件物品的体积是v[i],价值是w[i]。这些物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的体积总和不超过背包容量,且价值总和最大。

分析:这个问题变成了每组物品有若干种策略:是选择本组的某一件,还是一件都不选。也就是说设s[i][j]表示前i组物品花费费用j能取得的最大权值,则有s[i][j]=max{s[i-1][j], s[i-1][j-v[k]]+w[k]}(k取遍第i组的所有物品编号)。递推边界为i=0时s[i][j]=0。

使用一维数组的代码:

for (int i=0; i<=V; i++) s[i]=0  // 边界
for (int i=1; i<=组数; i++)
{
      for (int j=V; j>=0; j--)
      {
            for (int k=0; k<N; k++)
            {
                  if (物体k属于第i组)
                  {
                        if (j<v[k]) continue;
                        s[j]=max(s[j], s[j-v[k]]+w[k]);
                  }
            }
      }
}

你可能感兴趣的:(分组背包问题)