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