单调队列优化多重背包
#include <bits/stdc++.h>
using namespace std;
const int M = 2010;
const int N = 20010;
int q[N];
int hh = 0, tt = -1;
int f[N];
int g[N];
int v[M], w[M], s[M];
int n, m;
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
scanf("%d%d%d", &v[i], &w[i], &s[i]);
}
for (int i = 1; i <= n; i++) {
for (int j = 0; j < v[i]; j++) {
hh = 0, tt = -1;
memcpy(g,f,sizeof f);
for (int k = j; k <= m; k += v[i]) {
if (hh <= tt && q[hh] < k - s[i] * v[i]) hh++;
if (hh <= tt) f[k] = max(f[k], g[q[hh]] + (k - q[hh]) / v[i] * w[i]);
while (hh <= tt && g[q[tt]] - (q[tt] - j) / v[i] * w[i] <= g[k] - (k - j) / v[i] * w[i]) {
tt--;
}
q[++tt] = k;
}
}
}
cout << f[m];
return 0;
}
复习二维0-1背包,0-1背包,多重背包,完全背包,设计问题的‘恰好’和‘不超过’
Maven:
介绍
是 Apache 软件基金会旗下的一个项目,它采用项目对象模型(Project Object Model,POM)的概念来管理项目。POM 是一个 XML 文件,用于描述项目的基本信息、依赖关系、构建配置等。通过 POM,Maven 能够统一管理项目的构建过程,包括编译、测试、打包、部署等各个环节,使得项目的构建更加标准化和自动化。
核心功能
依赖管理:Maven 可以方便地管理项目的依赖关系。在 POM 文件中,只需声明项目所依赖的库及其版本号,Maven 就会自动从中央仓库或其他指定的仓库中下载所需的依赖库,并将其添加到项目的类路径中。这大大简化了项目中依赖库的管理,避免了手动下载和配置依赖库可能带来的版本冲突和路径错误等问题。
项目构建:Maven 定义了一套标准的项目构建生命周期,包括清理、编译、测试、打包、安装、部署等阶段。开发人员只需执行相应的 Maven 命令,就可以按照预定的生命周期阶段对项目进行构建。例如,执行mvn clean install命令,Maven 会先清理项目的输出目录,然后编译源代码,运行测试用例,将项目打包成可部署的格式,并将其安装到本地仓库中。
插件扩展:Maven 通过插件机制来实现各种功能的扩展。插件可以在 Maven 的生命周期的各个阶段被执行,从而实现对项目构建过程的定制化。例如,使用 Surefire 插件可以运行单元测试,使用 Failsafe 插件可以运行集成测试,使用 Javadoc 插件可以生成项目的 Java 文档等。
工作原理
仓库:Maven 有本地仓库和远程仓库之分。本地仓库是存储在本地计算机上的一个目录,用于缓存从远程仓库下载的依赖库和项目构件。远程仓库则是位于网络上的服务器,用于存储各种开源项目的依赖库和构件。当 Maven 需要下载某个依赖库时,它会先在本地仓库中查找,如果找不到,则会从远程仓库中下载,并将其存储到本地仓库中供后续使用。
构建过程:Maven 根据 POM 文件中的配置信息,按照预定的生命周期阶段来执行构建任务。在每个阶段,Maven 会调用相应的插件来完成具体的工作。例如,在编译阶段,Maven 会调用 Compiler 插件来编译 Java 源代码;在打包阶段,会根据项目的类型(如 Java Web 项目、Java 应用程序等)调用相应的打包插件(如 War 插件、Jar 插件等)将项目打包成可部署的格式。
第一部:构建Maven项目
java->构建系统:Maven->创建
现在就是第一个Maven项目了
第二部:了解Maven的项目结构
src使我们的资源部分,它分为main和test,分别是用于我们主要代码编写和测试代码的编写
main/java:我们编写java类
main/resource:我们存静态资源和配置文件
main/webapp:网页资源
test也同理
target:存放编译出来的内容
pom.xml是我们Maven项目的核心,里面以project为根,通过三元定位项目:(groupId组名,artifactId组中唯一名称,version版本号)
第三部:依赖导入
<dependencies>
<dependency>
三元组(Maven坐标)
</dependency>
</dependencies>
可以在浏览器的官方库里面找找
如果下载慢or下载不了,可以换成国内的镜像仓库:
配置方法:
在IDEA的文件夹中的plugings/maven/lib/maven3/conf的settings找到里面的mirrors,把里面的mirror改为国内仓库即可
第四部:主要的Maven作用域
1. compile(默认作用域)
此作用域是默认的依赖作用域。处于该作用域的依赖在项目的所有构建阶段都可用,包括编译、测试和运行时,并且依赖会被传递给依赖该项目的其他项目。
示例代码如下:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<!-- 这里scope默认是compile --></dependency>
2. provided
provided作用域意味着该依赖在编译和测试阶段是必需的,但在运行时由 JDK 或者容器提供。比如在开发 Java Web 应用时,Servlet API 通常是由 Servlet 容器(像 Tomcat)提供的,因此 Servlet API 依赖就可以设置为provided作用域。
示例代码如下:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope></dependency>
3. runtime
runtime作用域表示依赖在运行和测试阶段是必需的,但在编译阶段不是必需的。像 JDBC 驱动,在编译代码时不需要它,但在运行时要使用它来连接数据库。
示例代码如下:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
<scope>runtime</scope></dependency>
4. test
test作用域表明依赖仅在测试编译和测试运行阶段可用,在项目的正常编译和运行时不会用到。JUnit 就是一个典型的例子,它仅用于编写和运行测试用例。
示例代码如下:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope></dependency>
第五部:自己项目作为依赖
把自己代码作为依赖引入,在pom.xml里面找到我们的三元组信息
找到maven选项
点击install
然后在这个主机上就可以直接引入了
第六部:测试和打包
clean:执行后会清理掉target文件夹
validate:严重项目的可用性
compile:编译项目
test:一键运行test下的测试案例(在/test,用Junit里面的测试注释)
verify:按照默认的生命周期运行项目:validate->compile->package
package:大宝成为jar包,但是没有依赖,没有主清单属性等等
可以通过 mvn package -Dmaven.test.skip=true 可以跳过测试直接打包