2021-08-01

E - Cut Ribbon

Polycarpus has a ribbon, its length is n. He wants to cut the ribbon in a way that fulfils the following two conditions:

After the cutting each ribbon piece should have length a, b or c.
After the cutting the number of ribbon pieces should be maximum.
Help Polycarpus and find the number of ribbon pieces after the required cutting.

Input
The first line contains four space-separated integers n, a, b and c (1 ≤ n, a, b, c ≤ 4000) — the length of the original ribbon and the acceptable lengths of the ribbon pieces after the cutting, correspondingly. The numbers a, b and c can coincide.

Output
Print a single number — the maximum possible number of ribbon pieces. It is guaranteed that at least one correct ribbon cutting exists.

Examples
Input
5 5 3 2
Output
2
Input
7 5 5 2
Output
2
Note
In the first example Polycarpus can cut the ribbon in such way: the first piece has length 2, the second piece has length 3.

In the second example Polycarpus can cut the ribbon in such way: the first piece has length 5, the second piece has length 2.

题意: 就是一个长为N的彩带,剪成长度为a,b,c中的一种,色带片的数量应最大
题解: 这个题虽然简单但是,是一个完全背包问题。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int dp[4010];//不能开小 
int main()
{
	int i,j,n,m,t[3];
	scanf("%d %d %d %d",&n,&t[0],&t[1],&t[2]);
	memset(dp,-40,sizeof(dp));//负数要尽量小。 
	dp[0]=0;
	for(i=0;i<3;i++)//3个可以“无限取的”,“完全背包” 
	{
		for(j=t[i];j<=n;j++)//枚举每一个,尽可能的装。 
		{
			dp[j]=max(dp[j],dp[j-t[i]]+1);// 
		}
	}
	printf("%d\n",dp[n]);
	return 0;
}

这个是我感觉讲背包比较好的链接
https://valen.blog.csdn.net/article/details/87878853?spm=1001.2014.3001.5506

<think>我们正在处理一个关于SQL日期范围查询的问题,用户特别提到了“BETWEENDATE_ADD”这样的关键词。根据用户的问题,他可能想要使用DATE_ADD函数结合BETWEEN来进行日期范围查询。根据引用[2],有一个示例查询使用了BETWEEN和DATE_ADD:SELECT*FROMmy_tableWHEREtimestamp_columnBETWEEN'2025-03-2815'ANDDATE_ADD(CONCAT('2025-03-2815',':00:00'),INTERVAL1HOUR);这个例子中,BETWEEN的起始是一个字符串日期,结束则使用了DATE_ADD函数。所以,我们可以使用DATE_ADD来构造一个结束时间。另外,引用[5]提到了DATEADD函数(注意在MySQL中是DATE_ADD,而在SQLServer中是DATEADD),其语法是:DATEADD(datepart,number,date)在MySQL中,DATE_ADD的语法类似,也是指定时间间隔单位和数量。用户的问题是关于“BETWEENDATE_ADD”的语法,实际上就是如何在BETWEEN中使用DATE_ADD函数来定义日期范围。常见的使用场景是:我们有一个起始时间,然后通过DATE_ADD加上一段时间来得到结束时间,然后查询这个区间内的数据。例如,查询从当前时间开始,未来一小时内的数据:SELECT*FROMtableWHEREtimestamp_columnBETWEENNOW()ANDDATE_ADD(NOW(),INTERVAL1HOUR);或者查询过去24小时的数据:SELECT*FROMtableWHEREtimestamp_columnBETWEENDATE_SUB(NOW(),INTERVAL24HOUR)ANDNOW();注意:在MySQL中,DATE_ADD用于增加时间,DATE_SUB用于减少时间。也可以使用负数来实现减少时间。另外,需要注意BETWEEN是包含边界值的,即闭区间。如果用户使用的是其他数据库,如Oracle(引用[3])或SQLServer(引用[5]),语法会有所不同。但是用户问题中没有明确数据库类型,我们以MySQL为例,因为引用中MySQL的例子较多。因此,我们可以给用户一个通用的MySQL示例:假设我们要查询某个时间字段在从当前时间前7天到当前时间之间的数据:```sqlSELECT*FROMmy_tableWHEREdate_columnBETWEENDATE_SUB(NOW(),INTERVAL7DAY)ANDNOW();```或者,我们也可以使用DATE_ADD来减去时间(用负数):```sqlSELECT*FROMmy_tableWHEREdate_columnBETWEENDATE_ADD(NOW(),INTERVAL-7DAY)ANDNOW();```如果用户有特定的起始日期,比如从2023-01-01开始,加上30天作为结束日期:```sqlSELECT*FROMmy_tableWHEREdate_columnBETWEEN'2023-01-01'ANDDATE_ADD('2023-01-01',INTERVAL30DAY);```注意:日期字符串的格式必须与数据库中的日期格式匹配,通常使用'YYYY-MM-DD'格式。另外,引用[1]中提到,在DB2中,BETWEEN?AND?允许有一个值为空。但是,在MySQL中,如果BETWEEN的一个边界为NULL,则条件会变为NULL,不会返回任何行。所以,如果用户需要处理可能为空的情况,需要特别处理,例如:```sqlSELECT*FROMmy_tableWHERE(date_column>=?OR?ISNULL)AND(date_column<=?OR?ISNULL)```但是用户的问题中没有提到空值的情况,所以我们主要关注BETWEEN和DATE_ADD的组合使用。总结一下,用户需要的语法是:在BETWEEN子句中,可以使用DATE_ADD函数来动态计算结束日期。下面,我们以MySQL为例,给出一个完整的示例。</think>### SQL 日期范围查询语法详解 在 SQL 中,使用 `BETWEEN` 和 `DATE_ADD` 进行日期范围查询的典型语法如下: ```sql SELECT * FROM 表名 WHERE 日期字段 BETWEEN '起始日期' AND DATE_ADD('起始日期', INTERVAL 时间量 时间单位); ``` #### 核心组件说明: 1. **`BETWEEN` 运算符** 用于指定闭区间范围 `[起始值, 结束值]`,包含边界值 2. **`DATE_ADD()` 函数** 语法:`DATE_ADD(基准日期, INTERVAL 数值 时间单位)` 支持的时间单位:`DAY`、`MONTH`、`YEAR`、`HOUR`、`MINUTE` 等[^5] #### 实用示例: 1. **查询未来7天内的数据** ```sql SELECT * FROM orders WHERE order_date BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 7 DAY); ``` 2. **查询过去24小时记录** ```sql SELECT * FROM logs WHERE timestamp BETWEEN DATE_ADD(NOW(), INTERVAL -24 HOUR) AND NOW(); ``` 3. **特定月份查询优化** ```sql SELECT * FROM sales WHERE sale_date BETWEEN '2023-10-01' AND DATE_ADD(LAST_DAY('2023-10-01'), INTERVAL 1 DAY); ``` > 使用 `LAST_DAY()` 获取月末日期[^4],`INTERVAL 1 DAY` 包含最后一天全天数据 #### 重要注意事项: 1. **日期格式一致性** 必须确保比较的日期格式相同,推荐使用 `YYYY-MM-DD HH:MM:SS` 格式 2. **性能优化** - 对日期字段建立索引 - 避免在 `WHERE` 子句中对日期列使用函数(如 `DATE_FORMAT()`)[^2] - 使用 `EXTRACT()` 函数提取日期部分可提高效率[^3] 3. **空值处理** 如引用[1]所述,当 `BETWEEN` 边界值为空时,DB2 等数据库可能返回非预期结果,建议添加空值检查: ```sql WHERE (date_column >= ? OR ? IS NULL) AND (date_column <= DATE_ADD(?, INTERVAL 1 DAY) OR ? IS NULL) ``` 4. **时区问题** 涉及时间戳时,使用 `CONVERT_TZ()` 确保时区一致: ```sql WHERE timestamp BETWEEN CONVERT_TZ('2023-10-01 00:00:00','UTC','+08:00') AND CONVERT_TZ('2023-10-02 00:00:00','UTC','+08:00') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值