当前位置:首页 > GESP > GESP2023年六级真题解析:动态规划解决小杨买饮料问题(洛谷3873)

GESP2023年六级真题解析:动态规划解决小杨买饮料问题(洛谷3873)

7个月前 (06-02)

GESP2023年六级真题解析:动态规划解决小杨买饮料问题(洛谷3873) GESP六级 动态规划 背包问题  第1张

一、题目解读

小杨买饮料是GESP 2023年六级认证考试中的一道经典动态规划题目,考察学生对背包问题的理解和应用能力。题目描述小杨需要购买n种饮料,每种饮料有特定的体积w和价格v,他要在不超过容量l的情况下,选择最便宜的购买方案。这道题实质上是背包问题的变种,需要运用动态规划思想求解。

二、解题思路

采用动态规划(DP)的方法解决这个问题。核心思想是构建一个二维数组dp,其中dp[i][j]表示前i种饮料在容量j时的最小花费。通过遍历所有饮料和所有可能的容量,逐步填充这个二维数组,最终得到最优解。

三、解题步骤

  1. 输入饮料种类数n和背包容量l

  2. 创建数组v和w分别存储每种饮料的价格和体积

  3. 初始化二维dp数组,边界条件设置为0

  4. 双重循环填充dp数组:

    • 外层循环遍历所有饮料

    • 内层循环遍历所有可能的容量

    • 根据当前饮料是否放入背包更新dp值

  5. 输出最终结果,若无解则输出"no solution"

四、代码实现(附注释)

#include<iostream>
using namespace std;

int main()
{
	int n, l;  // n为饮料种类数,l为背包容量
	cin >> n >> l;
	int* v = new int[n];  // 存储每种饮料的价格
	int* w = new int[n];  // 存储每种饮料的体积
	for (int i = 0; i < n; i++)
	{
		cin >> v[i] >> w[i];  // 输入每种饮料的价格和体积
	}
	
	// 初始化动态规划数组dp
	int** dp = new int* [n + 1];
	for (int i = 0; i <= n; i++)
	{
		dp[i] = new int[l + 1];
		for (int j = 0; j <= l; j++)
		{
			if (!i or !j)dp[i][j] = 0;  // 边界条件初始化
		}
	}
	
	// 填充dp数组
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= l; j++)
		{
			if (w[i-1] > j)dp[i][j] = v[i-1];  // 当前饮料体积超过剩余容量
			else dp[i][j] = min(dp[i - 1][j], v[i-1]+dp[i - 1][j - w[i-1]]);  // 取最小值
		}
	}
	
	// 输出结果
	if (dp[n][l] == 0)cout << "no solution";
	else cout << dp[n][l];

	return 0;
}

五、总结

这道题目很好地考察了动态规划在实际问题中的应用。通过构建二维dp数组,我们可以系统地解决这类背包问题变种。关键在于理解状态转移方程和边界条件的处理。掌握这种解题思路对参加编程竞赛和算法考试都有很大帮助。


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣70题:告别暴力递归!从零实现记忆化搜索解法

力扣70题:告别暴力递归!从零实现记忆化搜索解法

题意解析:想象你站在楼梯底部,面前有n级台阶。每次你可以选择跨1级或2级台阶,最终到达顶端的路径有多少种不同的走法?这个问题本质上是在探索分叉决策的叠加效果——当我们把每个台阶处的选择看作二叉树的分支...

力扣1137题:动态规划解泰波那契数 高效求解第N项的秘密

力扣1137题:动态规划解泰波那契数 高效求解第N项的秘密

一:重新解读题目泰波那契数列是一个充满数学趣味的递推序列:从第3项开始,每个数均为前三个数的和(即Tₙ₊₃ = Tₙ + Tₙ₊₁ + Tₙ₊₂)。当给定整数n时,需要高效计算出第n项的值。面对此类递...

力扣5:中心扩散法 轻松破解最长回文子串

力扣5:中心扩散法 轻松破解最长回文子串

题目解读:在一个给定的字符串中,我们需要找到最长的回文子串。回文是指正读反读都相同的字符串,如"aba"、"abba"都是回文。这个问题看似简单,但要在字符串中...

牛客DP41精讲:当背包必须装满时,你的状态转移方程该如何调整?

牛客DP41精讲:当背包必须装满时,你的状态转移方程该如何调整?

题目重解我们面对一个经典背包问题的变体:给定n个物品,每个物品有重量w和价值v,背包容量为V。需要回答两个问题:1) 普通情况下能获得的最大价值;2) 必须恰好装满背包时的最大价值(若无法装满则输出0...

2024年GESP五级武器强化(洛谷B4071)解题代码C++版

2024年GESP五级武器强化(洛谷B4071)解题代码C++版

一、题目解读    2024年GESP(青少年软件编程能力等级考试)五级中的“武器强化”(洛谷平台题目编号B4071)是一道典型的算法优化问题。题目要求通过合理...

CSP-J 2019公交换乘题解析:基于队列优化的动态规划代码详解

CSP-J 2019公交换乘题解析:基于队列优化的动态规划代码详解

一、题目解读CSP-J 2019年的“公交换乘”题目(洛谷P5661)要求模拟地铁与公交交替出行的费用计算。题目核心在于地铁消费会产生优惠券,而公交可在45分钟内使用优惠券抵扣车费。需要处理n条出行记...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。