大致題意:某人要買鞋子,有k種鞋,要求每種鞋至少買一雙,給出每雙鞋子的花費和價值,問m元錢可以買到的鞋子的最大價值是多少。
思路:分組背包問題。與傳統的分組背包不同:每組物品至少取一件;且每組中物品任意取。
想一想傳統的分組背包,每組至多選一件:
for 所有的組k
for v=V..0
for 所有的i屬於組k
f[v]=max{f[v],f[v-c[i]]+w[i]}
這裡需要每組至少選一個,需要對每組中的物品進行01背包,即該物品在該組中要麼被選要麼不被選。實現這一目的,只需要將第二個循環與第三個循環交換一下即可。
具體解法:設dp[i][j]表示到第i組為止j元錢能夠獲得的最大價值。
dp[i][j] = Max(dp[i][j],dp[i][j-item[i][k].cost]+item[i][k].val, dp[i-1][j-item[i][k].cost]+item[i][k].val)。
初始化所有的dp[i][j] = -1,表示所有的都不合法,是為了保證每組物品能夠至少取一件;dp[0][0-m] = 0為了使第一組能夠合法計算。
#include #include #include #include