限制取出物品数量的01背包问题

58 阅读1分钟

有4个物品,重量是[1,4,6,4], 价值是[3,4,10,10], 背包容量是8, 限制最多只能取出2个物品,问最大的价值? 使用记忆化搜索。


def jiyihua(ws, vs, step , w, sel, table):
    '''

    :param ws:  物品的重量表
    :param vs: 物品的价值表
    :param step: 考虑第step个物品到最后一个物品, 物品的编号从0开始!
    :param w: 容量是w
    :param sel: 可选物品数量
    :param table: 记忆化的表格
    :return: 在以上情况下获得的最大价值
    '''
    key = f'{step},{sel},{w}'
    if key in table:
        return table[key]
    if step==len(ws) or sel==0:
        return 0
    if w-ws[step]>=0:
        table[key] = max(jiyihua(ws,vs,step+1,w,sel,table), jiyihua(ws,vs,step+1,w-ws[step],sel-1,table)+vs[step])
    else:
        table[key] = jiyihua(ws,vs,step+1,w,sel,table)
    return table[key]

if __name__ == '__main__':
    weights = [1,4,6,4]
    values = [3,4,10,10]
    step = 0
    # 最多选择2个物品
    selected = 2
    # 背包容量是8
    w = 8 
    table = {}
    print(jiyihua(weights, values, step, w, selected, table))
    print(table)