商品最大价值,本题是2022年1月22日举办的第13届蓝桥杯青少组Python编程选拔赛真题编程部分第5题。小蓝桌子上摆放着一个容积为 m 的书包及n件不同的商品,且每件商品上都标有商品的体积和商品的价值,请编程计算出能装入书包的商品的最大价值。
先来看看题目的要求吧。
编程实现:
小蓝桌子上摆放着一个容积为m的书包及n件不同的商品,且每件商品上都标有商品的体积和商品的价值。
小蓝要满足以下要求挑选商品装入书包中
要求 1:挑选的商品总体积不超过书包的容积;
要求 2:挑选的商品商品总价值最大。
请你帮助小蓝计算出能装入书包的商品的最大价值。
输入描述:
第一行输入两个正整数m和n,m表示书包的容积,n表示商品的数量。两个正整数之间一个英文逗号隔开
第二行输入n个正整数表示商品的体积,正整数之间一个英文逗号隔开
第三行输入n个正整数表示商品的价值,正整数之间一个英文逗号隔开(商品价值的输入顺序对应商品体积输入顺序)
输出描述:
输出装入书包的商品的最大价值
样例输入:
11,3
2,6,4
1,5,2
样例输出:
7
这是一道算法题,涉及的知识点包括循环、列表、枚举算法和动态规划等。
枚举算法 动态规划
定义DP数组 初始化DP数组 状态转移方程 遍历顺序
不装入 装入
dp[i][j] = max(
dp[i - 1][j],
dp[i - 1][j - v[i]] + p[i]
)
其中:
v[i]表示当前商品的体积
p[i]表示当前商品的价值
思路有了,接下来,我们就进入具体的编程实现环节。
枚举算法
动态规划
1. 递归算法
根据前面的思路分析,我们编写代码如下:
代码不多,说明两点:
1). 在获取m和n的时候,先使用了列表推导式,得到列表,然后使用解包赋值运算对m和n赋值;
2). 在计算体积和和商品和时,使用了列表推导式,得到一个列表,然后直接使用sum()函数求和,代码非常简洁;
2. 动态规划
根据前面的思路分析,编写代码如下:
代码其实不多,说明三点:
1). 在定义dp二维数组的时候,结合了快速创建列表和列表推导式的编程技巧,此处的下划线_是一个变量名;
2). dp二维数组增加了i = 0的行和j = 0的列,实际计算是从dp[1][1]开始的;
3). 在获取商品i的体积和价值时,需要将i减去1,因为v和p两个列表的下标都是从0开始的。
至此,整个程序就全部完成了,你可以输入不同的数据来测试效果啦。
循环语句;
列表操作;
枚举算法;
动态规划算法;
01背包问题;
作为本次测评的最后一题,虽然代码不多,但是难度较大。关键点是熟练掌握动态规划算法的思想和分析方法。
01背包是经典的动态规划问题,具体来说,它属于线性DP,其特点是每个状态通常只与前一个或几个状态相关,因此可以使用一维或二维数组来存储和计算状态。
解决线性DP问题的一般步骤包括定义状态、确定状态转移方程、设定初始条件和确定遍历顺序,然后通过循环计算最优解,从而求解问题。
理解动态规划算法最好的方法就是画出表格,一步一步分析,千万不要纠结于代码本身,一般来说,动态规划的代码都比较简短,写起来也很快。
超平老师给你留一道思考题,本题可以使用递归方法来实现吗,代码如何编写呢?
你还有什么好的想法和创意吗,也非常欢迎和超平老师分享探讨。
需要源码的,可以添加本人微信。
另外,超平老师创建了一个蓝桥杯备考交流群,这是专门为老师和家长打造的免费社群,您可以与来自全国各地的老师、家长共同交流经验,分享学习心得。
超平老师也会给大家带来及时的赛事动态,备考攻略,真题资源分享,帮助各位更好地备考第15届蓝桥杯赛事,力争取得优异的成绩。
扫码或长按加入微信群