思路
当时看的时候看出来是动态规划了,但是好几年的菜鸟生活告诉我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])