外卖(动态规划-背包DP)

本文探讨了如何使用动态规划算法解决外卖行业的配送费用问题,通过实例演示和代码实现,展示了如何在满足最低配送金额条件下,找到最经济的菜品组合。关键步骤包括排序菜品价值、构建DP状态转移方程并优化决策过程。

外卖(动态规划-背包DP)

题目描述

Bob 是一个重度外卖依赖者。这天他挑中了一家店,这家店总共有 n 种菜品,每种菜品限点一份,需要满 m 元钱才可配送,因此 Bob 想知道他至少需要花多少钱才能满足最低配送要求。

输入

输入共两行,第一行为两个正整数,n 和 m,第二行为 n 个正整数 ai  

输出

输出一个数,满足最低配送要求所花的最少钱数。

样例输入 

【样例1】
3 10 
3 7 9
【样例2】
5 12 
10 11 7 8 9
【样例3】
3 8 
1 6 9 

样例输出

【样例1】
10
【样例2】
15
【样例3】
9

提示

对于第二个样例,最低配送要求为 12 元,最优解为点 7 块和 8 块的两个菜,最少花 15元。 

对于 30% 的数据,满足 n ≤ 15 。 
对于 100% 的数据,满足 n ≤ 200, m ≤所有ai的和 ≤ 50000 。

 

思路:经典的01背包DP,但是有些小细节要注意一下,首要要先排序,先拿值比较小的,再拿大的,然后当出现大于等于m的值时,选取最小的值,附上AC代码

#include<bits/stdc++.h>
using namespace std;

int dp[205][50005] = { 0 }; 
int arr[205] = { 0 };

int main()
{
	int n = 0; int m = 0;
	cin >> n >> m;
	
	int loop = 0;
	for(int i = 1; i <= n; ++i)
	{
		cin >> arr[i];
		loop += arr[i];
	}
	
	int res = INT_MAX;
	
	sort(arr + 1, arr + 1 + n);
	
	for(int i = 1; i <= n; ++i)
	{
		for(int j = 1;  j <= loop; ++j)
		{
			if(j < arr[i])
				dp[i][j] = dp[i - 1][j];
			else
				dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - arr[i]] + arr[i]);
			
			if(dp[i][j] >= m)
				res = min(res, dp[i][j]);	
		}
	}
	
	cout << res << endl;
	
	return 0;
}

 

### 外卖系统实体关系图(E-R图)设计与数据库建模 在构建外卖系统时,数据库的设计至关重要。为了确保系统的高效性和可扩展性,通常会采用实体关系图(E-R图)来进行概念模型的设计[^1]。通过E-R图可以清晰地展示系统中的各个实体及其之间的关联。 #### 1. 实体定义 在外卖系统中,主要涉及以下几个关键实体: - **管理员信息** 管理员负责维护系统运行,其属性可能包括`管理员ID`、`用户名`、`密码`等。这些信息构成了管理员信息实体的核心属性[^1]。 - **用户信息** 用户是外卖系统的主要使用者,其实体属性一般包括`用户ID`、`姓名`、`手机号`、`地址`以及`邮箱`等基本信息。 - **商家信息** 商家提供商品和服务,其实体属性可能有`商家ID`、`名称`、`联系方式`、`营业时间`、`配范围`等。 - **菜品信息** 菜品由商家提供,属于商家的子集。其属性包括`菜品ID`、`名称`、`价格`、`库存量`、`分类`等。 - **订单信息** 订单记录用户的购买行为,其属性包括`订单号`、`下单时间`、`总金额`、`状态`(如待支付、已支付、已完成)、`用户ID`和`商家ID`等。 #### 2. 实体间的关系 以下是几个重要的实体间关系: - **用户与订单**:一对多关系,即一个用户可以有多份订单。 - **商家与菜品**:一对多关系,表示一家商家可以提供多种菜品。 - **订单与菜品**:多对多关系,因为一份订单可以包含多个菜品,而一种菜品也可以出现在不同的订单中。 - **管理员与用户/商家**:管理关系,管理员有权查看并操作用户和商家的数据。 #### 3. 数据库表设计 基于以上分析,可以初步设计以下几张数据表: ```sql -- 用户表 CREATE TABLE Users ( UserID INT PRIMARY KEY AUTO_INCREMENT, Name VARCHAR(50), PhoneNumber VARCHAR(15), Address TEXT, Email VARCHAR(100) ); -- 商家表 CREATE TABLE Merchants ( MerchantID INT PRIMARY KEY AUTO_INCREMENT, Name VARCHAR(100), ContactNumber VARCHAR(15), BusinessHours TIME, DeliveryRange DECIMAL(5, 2) ); -- 菜品表 CREATE TABLE Dishes ( DishID INT PRIMARY KEY AUTO_INCREMENT, Name VARCHAR(100), Price DECIMAL(8, 2), Stock INT, Category VARCHAR(50), MerchantID INT, FOREIGN KEY (MerchantID) REFERENCES Merchants(MerchantID) ); -- 订单表 CREATE TABLE Orders ( OrderID INT PRIMARY KEY AUTO_INCREMENT, CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP, TotalAmount DECIMAL(10, 2), Status ENUM('Pending', 'Paid', 'Completed'), UserID INT, MerchantID INT, FOREIGN KEY (UserID) REFERENCES Users(UserID), FOREIGN KEY (MerchantID) REFERENCES Merchants(MerchantID) ); -- 订单详情表 CREATE TABLE OrderDetails ( DetailID INT PRIMARY KEY AUTO_INCREMENT, OrderID INT, DishID INT, Quantity INT, SubTotal DECIMAL(8, 2), FOREIGN KEY (OrderID) REFERENCES Orders(OrderID), FOREIGN KEY (DishID) REFERENCES Dishes(DishID) ); ``` #### 4. E-R图绘制 E-R图可以通过图形化的方式直观展现上述实体及它们之间的关系。常见的绘图工具有MySQL Workbench、Lucidchart或Draw.io等工具。具体实现过程中需要注意以下几点: - 明确每个实体的关键属性; - 准确标注实体间的连接线类型(一对一、一对多或多对多); - 验证逻辑一致性以减少冗余和冲突。 #### 总结 良好的数据库设计能够显著提升外卖系统的性能和用户体验。利用E-R图作为桥梁,在实际开发前完成充分的概念建模是非常必要的[^2]。此外,选用合适的数据库管理系统(DBMS),例如Mysql,有助于保障数据的安全性和稳定性[^1]。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值