- 博客(51)
- 收藏
- 关注
原创 多重背包问题II
这样,每种物品都被拆分成若干个新的物品,每个新物品的数量都是2的幂次,可以直接使用01背包问题的解法来求解。接下来有 N 行,每行三个整数 vi,wi,si 用空格隔开,分别表示第 i 种物品的体积、价值和数量。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。基本思想是将每种物品的数量拆分成若干个2的幂次的和。有 N 种物品和一个容量是 V 的背包。
2024-03-06 20:35:38 437
原创 多重背包问题I
接下来有 N 行,每行三个整数 vi,wi,si 用空格隔开,分别表示第 i 种物品的体积、价值和数量。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。有 N 种物品和一个容量是 V 的背包。输出一个整数,表示最大价值。
2024-03-06 19:12:07 512
原创 完全背包问题
接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 种物品的体积和价值。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。第一行两个整数,N、V,用空格隔开,分别表示物品种数和背包容积。有 N种物品和一个容量是 V 的背包,每种物品都有无限件可用。第 i 种物品的体积是 vi,价值是 wi。输出一个整数,表示最大价值。
2024-03-06 16:53:10 445
原创 01背包问题
如果足够,我们可以计算放入该物品后的总价值,并与之前的最大价值进行比较,取较大值。具体的动态规划状态转移方程::dp[i][j] = max(dp[i-1][j], dp[i-1][j-v[i]] + w[i])2) 第 i 个物品选 :f [i][j] = f [ i-1 ][ j - v[i] ];f[i][j] 只看前 i 个物品,总体积是j 的情况下,总价值最大是多少。1) 第 i 个物品不选:f [i][j] = f [i-1][j];(当前物品的体积)。状态的计算: f [i][j] =?
2024-03-03 10:16:59 882
原创 经典DP-最长单调子序列
最长递增子序列的个数知识点Arrays.fill(count, 1); 是 Java 中的一个方法调用,用于将数组 的所有元素设置为指定的值,即 。这个方法来自于 类,是一个静态工具类,提供了很多用于操作数组(例如排序、搜索、填充等)的静态方法。在这个特定的情境下, 被用来初始化 数组。由于我们正在计算最长递增子序列的个数,每个元素至少可以作为一个长度为 1 的递增子序列的结束元素。因此, 数组的每一个位置都被设置为 ,意味着每个元素开始时都被视为一个独立的递增子序列。
2024-02-29 20:37:09 403
原创 经典DP-最大子数组
详解 变量定义:maxSubArray 方法:main 方法:当你运行这个程序时,它会输出 ,这是数组 中最大子数组的和(子数组为 )。
2024-02-29 19:33:51 381
原创 线性DP-前缀和
我们遍历输入字符串s中的每个字符。对于每个字符,我们检查它是1还是0,并相应地更新和。当我们遇到一个1时,我们增加的值,并将重置为0,因为我们正在构建一个连续的1的子字符串。类似地,当我们遇到一个0时,我们增加的值,并将重置为0。在每次更新或之后,我们还使用Math.max函数来更新maxLength1和maxLength0,以确保我们总是记录最长的连续子字符串长度。最后,我们比较maxLength1和maxLength0的值,如果maxLength1大于maxLength0,则返回true,否则返回。
2024-02-28 19:57:05 847
原创 动态规划-状态转移(O(n))
其实只要看透该题的本质 并不难,应用动态规划,题目就已经给出了状态方程的式子。首先规定好maxn的大小,防止溢出。定义nums数组。定义一个函数,写入状态方程式子。最后定义一个变量与数组元素进行对比,返回变量。
2024-02-28 17:55:23 381
原创 线性规划--状态转移(打家劫舍)
要解决这个问题,我们可以使用动态规划的方法。我们将问题分为两个子问题:偷窃前n-1家或者偷窃前n-2家。如果我们选择偷窃第n家,那么我们就不能偷窃第n-1家,因为它们是相邻的。所以,我们可以得到如下的递推关系:令dp[i]表示偷窃前i家能够得到的最高金额,则最终的答案就是dp[n-1]和dp[n-2]中的较大值,因为我们可以选择偷窃最后一家或者不偷窃最后一家。
2024-02-23 21:09:00 2003
原创 动态规划--持续更新篇
在函数中,首先设置f[0]为0,因为0已经是0了,不需要任何步骤。然后,使用一个for循环从1迭代到输入的整数num。对于每个整数i,如果i是奇数,则将f[i]设置为f[i-1] + 1,表示将i变为0需要先将i-1变为0,然后再执行一次减1操作。如果i是偶数,则将f[i]设置为f[i/2] + 1,表示将i变为0需要先将i/2变为0,然后再执行一次除以2的操作。最后,main函数从用户那里获取一个整数输入,并调用函数来计算将该整数变为0所需的步骤数,然后将结果输出到控制台。
2024-02-23 18:01:34 375
原创 贪心算法练习day2
1)初始化最小字母为‘Z’,确保任何字母都能与之比较2)遍历单词,找到当前未删除字母中的最小字母3)获取当前位置的字母 current = word.charAt(i);4)删除最小字母之前的所有字母 word=word.substring(index+1);5) 将最小字母添加到结果字符,更新剩余可删除字母数量 t -= index;
2024-02-18 13:12:40 1752 1
原创 贪心算法练习day1
根据金额和人数计算平均金额;对每个人的钱数进行从小到大排序;遍历排序后,将钱数少于平均金额的人 全部支付,再从总金额里减去该人所支付的金额;重新计算平均金额,剩余金额/剩余人数,同样钱数少于新平均金额的人也全部支付;最后钱最多的人支付剩余的。输入的是字符串,要想将两组字符串进行一一对比,需要将字符串转换成字符数组,再使用for循环依次遍历字符数组,进行比对。输入两行字符串,转换成两个字符数组;将初始数组和目标数组进行逐个对比,运用三目运算符进行判断。让每个人尽可能付接近平均金额的钱数。
2024-02-15 21:04:41 2966
原创 基本算法--贪心
作为算法的贪心,它的执行过程是把整个问题分解成多个步骤,在每个步骤都选取当前步骤的最优方案,直到所有步骤结束;---与之对应的是 int[] count=new int[coins.length],新定义的count数组也是int类型的。某人带着3种面值的硬币去购物,假设有1元、2元、5元的面值,硬币数量不限;,而很多问题都需要求全局最优,,所以在使用贪心法之前需要评估是否能从局部最优推广到全局最优。1)核心就是写一个方法,进行每次付总金额中能有多少个最大面值的个数,进行计数,更新剩余金额。
2024-02-14 20:26:44 476
原创 字面量你知道吗
字符类型:用单引号括起来的,内容有且只能有一个 'A' '0'注意:字符串类型:用双引号括起来 “HelloWorld”整数类型、小数类型、字符串类型、字符类型、布尔类型、空类型。字面量:告诉程序员 数据在程序中的书写格式。‘abc’ 形式错误。例:“ ”、“” 字符串类型。
2024-01-26 11:34:17 384
原创 JRE和JDK到底是什么呢
JRE:java的运行环境(JVM ,核心类库,运行工具)jhat内存分析工具。JVM:java虚拟机,真正运行java程序的地方。JDK:由以上三个组成,java开发工具包。核心类库:java已经写好的东西。开发工具:javac 编译工具。
2024-01-24 20:39:11 426 1
原创 ST表(SparsepTable)-解决区间最值大/小问题RMQ
(2)对任意一个区间最值查询,找到覆盖它的两个小区间,用小区间的最值算出答案。一个大区间若能被两个小区间覆盖,那么大区间的最值等于两个小区间的最值。(2)以任意元素为终点,它前面也有长度为1,2,4,...的小区间。第1组:长度为1的小区间,有n个小区间,每个小区间有1个元素。第2组:长度为2的小区间,有n个小区间,每个小区间有2个元素。第3组:长度为4的小区间,有n个小区间,每个小区间有4个元素。(1)以任意元素为起点,有长度为1,2,4,....的小区间。(2)极大的查询次数,每次查询只需要O(1)
2023-12-24 14:57:55 460
原创 算法复杂度-BigO表示法
算法的渐进时间复杂度,T(n)=O(f(n))T(n)表示算法的渐进时间复杂度。f(n)表示代码执行的次数。O()表示正比例关系。
2023-12-24 12:29:18 419
原创 学生管理系统-java版
package 学生管理系统;//创建集合容器对象lo://1.搭建主界面菜单System.out.println("--------欢迎来到学生管理系统--------");System.out.println("1 添加学生");System.out.println("2 删除学生");System.out.println("3 修改学生");System.out.println("4 查看学生");System.out.println("5 退出");
2023-12-10 16:47:44 1009
原创 ArrayList 集合 -- <>泛型
由以上代码和结果可知,ArrayList 集合这个容器,可以添加任意数据类型缺点是:如果我想让该集合中的所有数字进行相加求和,一旦遇到字符串,就会变成字符串的拼接。
2023-12-09 20:56:17 389
原创 java--集合基础
提供一种存储空间可变的存储模型,存储的数据容量可以发生改变集合和数组的区别共同点:都是存储数据的容器不同点:数组的容量是固定的,集合的容量是可变的。
2023-12-09 16:55:37 352
原创 排序算法--插入排序
在未排序的数列中找出一个哨兵,看它应该在 已经排好序的数列中的哪个位置,进行插入。整个数列分成两部分:第一部分是已经排好序的数列,第二部分是未排序的数列。
2023-12-09 15:34:21 553
原创 排序算法--选择排序
第一次:从未排序的数据元素里面,选出一个最小的或者是最大的元素,然后和第一位元素交换位置。第二次:选出第二小或者第二大的元素,然后和第二位元素交换位置。
2023-12-09 15:16:46 548
原创 排序与算法--冒泡排序
第二次:比较 8 7,将8和7进行交换:2 7 8 5 9 4 3。第四趟:2 4 3 5 7 8 9 第五趟:2 3 4 5 7 8 9 直到排序完成。第三次:比较 8 5,将8和5进行交换:2 7 5 8 9 4 3。第五次:比较 9 4,将9和4进行交换:2 4 5 8 4 9 3。第四次:比较 8 4 ,需要交换:2 5 7 4 8 3 9。第二次:比较 7 5,需要交换:2 5 7 8 4 3 9。第三次:比较 7 4,需要交换:2 5 4 7 3 8 9。第三次:比较 5 8,不需要交换。
2023-12-09 14:16:11 346
原创 简单实现--字符串--金额转换
目的:让数字和大写数字产生一一对应的关系String[] arr = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
2023-12-02 19:58:53 441
原创 简单实现 字符串拼接和反转
我干完了是否要把结果返回给调用处?(如果调用处继续使用,那么必须返回;如果不再使用,可以返回,也可以不返回)---必须返回。(4)不是每个元素后面都需要“, ”,通过控制 元素的索引,来控制拼接。---遍历数组并把数组拼接成一个字符串。我干这件事情需要什么前提才能完成?forr 后 需要进行修改。(1)想 遍历字符串 得到每一个字符,(2)“[” 需要在循环外提前定义好。方法:字符串名.charAt(i)(3)字符串拼接 用 + 号。(2)正序遍历:fori。定义一个方法,步骤是。
2023-12-01 22:34:53 417 1
原创 简单实现 遍历字符串和统计字符个数
str.charAt(i)是依次获取字符串每个索引对应的内容。不可以去掉' ',千万不可以!Ctrl +D 复制一行内容。
2023-12-01 21:06:01 379 1
原创 简单实现 用户登录 案例
Ctrl+Alt+V--------快速创建对象。Ctrl+Alt+L-------将代码格式化。例:sc.next() 用快捷键后直接出来。
2023-12-01 00:07:27 459 1
原创 字符串--String类
String是java定义好的一个类,在java.lang.String包中,使用时不需要导包字符串的内容不能发生改变,它的对象在创建后不能发生改变。字符串拼接是产生新的字符串,不会改变之前的字符串。
2023-11-30 22:59:18 307
原创 API 和API帮助文档
API(ApplicationProgrammingInterface):应用程序编程接口简单理解:别人写好的东西,我们不用再写了。java API :指的就是jdk中提供的各种功能的java类这些类将底层的实现封装了起来,我们不需要知道如何去实现,会使用就行帮助开发人员更好地使用API和查询API的一个工具。
2023-11-30 20:41:24 533
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人