分組揹包循環順序的正確性

分組揹包循環順序的正確性

核心代碼

for (int k = 1; k <= ts; k++)          //循環每一組
  for (int i = m; i >= 0; i--)         //循環揹包容量
    for (int j = 1; j <= cnt[k]; j++)  //循環該組的每一個物品
      if (i >= w[t[k][j]])
        dp[i] = max(dp[i],
              dp[i - w[t[k][j]]] + c[t[k][j]]);  
              //像0-1揹包一樣狀態轉移

關於循環順序的正確性。
正確的分組揹包:

  1. 先循環每組
  2. 再循環容量
  3. 最後是組員
  • -乍看之下,2-3步好像可以倒置,因爲都是把每一個組員做一遍狀態轉移。
  • -關鍵在第二個循環,第二個循環之所以是從m到0,就是爲了避免只能用一次的組員被反覆使用(見01揹包),而這裏是從一組裏面選一個,一組就相當於01揹包的一個物體,只不過循環k次找最優而已。
  • -如果倒置,就會變成每個組員都被當做一個物體,讓分組變得無意義,退化成01揹包了。

分組揹包題目:
https://www.luogu.com.cn/problem/P1757

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章