[Python-CSP]202209-2 何以包邮?

思路

当时看的时候看出来是动态规划了,但是好几年的菜鸟生活告诉我dp忘怎么写了……

所以回去复习一下动态规划还是有用的,这里考的就是一个比较简单的动规

求最小包邮数量,就相当于就在一定容量下,放弃最大价值的书籍,就转换成类01背包问题的解法
先创建与容量(即要放出去的书籍的总价值)大小相等的数组,index代表当前剩余容量,value代表当前最大价值
当前最大价值的计算取决于两个方向,一个是要留下当前这本书,一个是不留下
留下则代表在余量为index+book_price[i]时的价值中再加book_price[i]价值为当前余量为indeex时的价值;不留下则说明是当前不算这本书的price是的价值就是当前的价值(即不变化)
上面两种价值求其最大值,即为当前index检测到第i本书时的最大价值

在写的时候容易把内外两层遍历弄混,主要书不可以重复算,但是价值是需要重复修正的,所以书要在外层;同时余量是由大到小的,注意内层循环的遍历方向

代码

n,x = map(int,input().split())
book_prices = [0]*n
sum_price = 0
for i in range(n):
    book_prices[i] = int(input())
    sum_price += book_prices[i]

max_size = sum_price-x
dp = [0]*(max_size+1)
for i in range(n):
    
    for j in range(max_size-book_prices[i]+1):
        if j+book_prices[i]>max_size:
            continue
        dp[j] = max(dp[j],dp[j+book_prices[i]]+book_prices[i])

print(sum_price-dp[0])

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值