用到至少選擇一個,所以沒有空間優化 分組背包問題: 常見的三種分組問題: 分成K組: 1、每組最多只能取一件物品 一維數組偽碼: for 0 to K ?對每一組進行 ? ? for W to 0 ? 對每一個代價進行判斷 ///1 ? ? ?for all item i in group k ? ? ? ?///2 這行個互換好像也對 ? ? ?dp[w]=max(dp[w],dp[w-c[i]]+v[i]; ? 每個重量保證的只有一件物品來取最大值 2、每組隨意取(為01背包問題)******摘抄網絡**既然上面的順序是限制每組最多取一個,那調換一下順序即可,其實就是01背包。****** 一維偽碼: for 0 t0 K ? ? for all item i in group k ? ? ? for W to 0 ? ? ? dp[w]=max(dp[w],dp[w-c[i]]+v[i]); 3、每組至少取一個 沒見過一維的偽代碼 用二維: dp[ki][j]表示當前組的一件物品不選 dp[ki-1][j-w[i]]+v[i] 表示這是在ki組選第一個 dp[ki][j-w[i]]+v[i] 表示在這個ki組中再次選一個 dp[ki][j](處理完后的值)=max(dp[ki][j],dp[ki-1][j-w[i]]+v[i],dp[ki][j-w[i]]+v[i]) max分開的時候要注意順序 max(dp[ki][j],dp[ki-1][j-w[i]]+v[i])...... 在初始化時是ki==0(沒有組)這時是dp[0][j]=0 其余的是-inf ******解決一件物品都不取的問題