首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >背包变异

背包变异
EN

Stack Overflow用户
提问于 2018-07-09 07:59:16
回答 1查看 272关注 0票数 0

因此,我有一系列的优惠券,每个都有一个价格和数量,可以从它购买。我只能从优惠券上购买给定的商品数量,不多也不能少。如何找到最小的成本,以获得所需数量的项目与优惠券(并返回-1,如果不可能)?

例如,如果有4张优惠券:“10美元买3张”、“4美元买2张”、“4美元买2张”、“3美元买1张”和4件要买的物品,最低成本是8美元。

背包致力于寻找最大值,但最低限度,它只会继续不考虑任何优惠券,并得到一个0的答案。

这是我的密码:

代码语言:javascript
复制
int minimumCost(coupon_t coupons[], int numCoupons, int units) {

    if (units <= 0 || numCoupons <= 0)
        return 0;

    if (coupons[numCoupons-1].quantity > units)
        return minimumCost(coupons, numCoupons-1, units);

    coupon_t coupon = coupons[numCoupons-1];
    return min(coupon.price + minimumCost(coupons, numCoupons-1, units-coupon.quantity),
            minimumCost(coupons, numCoupons-1, units));

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-09 10:11:46

再想一想。正如您所说,关键是处理0。在典型的背包代码中,0有两个含义:“不买”和“不能买”。把它们分开似乎是可行的:

代码语言:javascript
复制
def minimum_cost(coupons, units, coupon_no=0):
    if units < 0 or coupon_no == len(coupons):
        # special value for "impossible"
        return None

    if units == 0:
        # no more space, so we're not buying anything else
        return 0

    quantity, price = coupons[coupon_no]
    next_coupon = coupon_no + 1

    if quantity > units:
        return minimum_cost(coupons, units, next_coupon)

    pre_purchase_value_when_used = minimum_cost(coupons, units - quantity, next_coupon)
    value_when_unused = minimum_cost(coupons, units, next_coupon)

    # return whichever is not impossible, or cheaper of two possibilities:
    if pre_purchase_value_when_used is None:
        return value_when_unused
    elif value_when_unused is None:
        return pre_purchase_value_when_used + price
    else:
        return min(pre_purchase_value_when_used + price, value_when_unused)

coupons = [[3, 10], [2, 4], [2, 4], [1, 3]]
units = 4
cost = minimum_cost(coupons, units)
print(cost)
# => 8

(请注意,除非缓存函数结果,否则递归不是动态规划,尽管让它使用表并不太困难。动态规划的关键在于使用存储来避免重新计算我们已经计算过的内容。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51240620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档