外卖(动态规划-背包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;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
苍穹外卖数据库的E-R图描述了该数据库中实体之间的关系,E-R图包括实体(Entity)、关系(Relationship)和属性(Attribute)三个要素。苍穹外卖数据库的E-R图主要包含以下几个实体: 1. 用户(User):记录用户的基本信息,包括用户ID、用户名、密码、电话等。 2. 商家(Business):记录商家的基本信息,包括商家ID、商家名、地址、联系电话等。 3. 订单(Order):记录订单的基本信息,包括订单ID、下单时间、餐地址等。 4. 菜品(Dish):记录菜品的基本信息,包括菜品ID、菜品名、价格、图片等。 5. 购物车(ShoppingCart):记录购物车中的菜品信息,包括购物车ID、用户ID、菜品ID等。 这些实体之间的关系如下: 1. 用户(User)和商家(Business)之间是一对多关系,即一个商家可以有多个用户点餐。 2. 商家(Business)和菜品(Dish)之间是一对多关系,即一个商家可以有多种菜品。 3. 订单(Order)和用户(User)之间是一对多关系,即一个用户可以有多个订单。 4. 订单(Order)和商家(Business)之间是一对多关系,即一个商家可以接收多个订单。 5. 订单(Order)和购物车(ShoppingCart)之间是一对多关系,即一个订单可以对应一个或多个购物车。 基于以上实体和关系,苍穹外卖数据库的E-R图可以用如下方式表示: ``` +-------------+ +-------------+ | User | | Business | +-------------+ +-------------+ | | | | | | | | +--+ +----------------+ | ShoppingCart |--+ +----------------+ | | | | +--+ | Dish | +--------+ ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值