背包问题
01 背包有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。
第 i 件物品的体积是 $v_i$,价值是 $w_i$。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。
输入格式第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。
接下来有 N 行,每行两个整数 $v_i,w_i$,用空格隔开,分别表示第 i 件物品的体积和价值。
输出格式输出一个整数,表示最大价值。
数据范围$0< N,V ≤ 1000$$0< v_i,w_i ≤ 1000$
输入样例123454 51 22 43 44 5
输出样例:18
思路+方法f[i][j]表示面对第 i 件物品时,体积为 j 的背包的最大总价值。两种选择:1. 不放入第 i 件物品。 2. 放入第 i 件物品。
状态转移方程:f[i][j]=max(f[i−1][j],f[i−1][j−w[i]]+v[i])
优化:f[j]=max(f[j],f[j−w[i]]+v[i])。此时 j 要从大到小遍历,保证第 i 件物品只能选择一次。否则 f[i][j] 会由 f[i ...
CSS 布局知识
CSS实现垂直水平居中对于父元素 parent 与 子元素 child,如何实现子元素在父元素内部的水平垂直居中?
元素的 html 代码如下:
1234567891011121314151617181920212223242526<!DOCTYPE html><html><head> <title>Document</title> <style> .parent{ width: 500px; height: 500px; background-color: aquamarine; } .child{ width: 200px; height: 200px; background-color: coral; } </style></head>< ...
CSS 知识要点
选择元素
基本元素选择
12/* 把段落文本设置成红色,12像素大,粗体 */p {color:red; font-size:12px; font-weight:bold;}
上下文选择
12/* 选择祖先元素为 article 标签的所有段落 p 后代 */article p {color:red; font-size:12px; font-weight:bold;}
特殊上下文选择
子选择符12/* 将 section 的 h2 子元素的字体设置为 italic */section > h2 {font-style:italic;}
紧邻同胞选择
12/* 将紧邻着 h2 的元素同胞 p 选择设置 */h2 + p {font-style:italic;}
一般同胞选择12/* 将 h2 与 p 之间的同胞全部选择 */h2 ~ p {font-style:italic;}
通用选择
1234/* 全文所有字体颜色(包括文本框)设置为黑色 */* {colo ...
自己实现简单版Vue--3. 实现数据的双向绑定和Proxy代理
数据的双向绑定之前我们已经实现数据影响视图,即数据更新调用setter()方法里绑定的方法,通过Dev通知Watcher更新视图。
然后我们需要实现视图影响数据进而再影响视图。
通过为input节点利用Object.addEventListener()绑定事件监听,再调用数据更新方法更新数据。
数据更改后由于之前已经实现了数据更改后页面的自动更新,由此数据自然驱动视图。
12345678910111213141516// 编译模版具体执行const compileUtil = { // ... 省略 model(node, expr, vm) { const value = this.getValue(expr, vm); // v-model绑定对应的 Watcher, 数据驱动视图 new Watcher(expr, vm, (newVal)=>{ this.updater.modelUpdater(node, newVal); }); ...
自己实现简单版Vue--2. 实现数据绑定视图
利用Object.defineProperty()方法实现数据的监听Object.defineProperty()方法可以具体参考链接:http://sunyunzeng.com/JavaScript%E4%B8%AD%E7%9A%84%E5%AF%B9%E8%B1%A1/#%E8%AE%BF%E9%97%AE%E5%99%A8%E5%B1%9E%E6%80%A7
该方法可以定义对象数据在访问操作时的一些约定。
定义 Observer 对象
123456789101112131415161718192021222324252627282930313233class Observer{ constructor(data){ this.observe(data); } // data是一个对象,可能嵌套其它对象,需要采用递归遍历的方式进行观察者绑定 observe(data){ if(data && typeof data === 'object'){ ...
自己实现简单版Vue--1. 编译初始Vue模版
前言Vue的双向绑定效果如下:
Vue的底层到底是怎么实现的呢?
通过手写简单的示例来学习Vue框架的运行机制。
Vue是MVVM框架,其实就是MVC框架在前端的体现,其中的控制器(Controller)由View MOdel(VM)代替。
简单来说,数据更新视图,以及视图更新影响数据这两步操作或者是双向绑定的过程由VM来执行。
而Vue就是一个VM。
Vue的可以说是开箱即用,它的使用非常简单,如下所示:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> ...
JS异步函数小结
JS的异步JavaScript的执行环境是单线程的,对于http事件触发线程、浏览器事件触发线程、浏览器定时器等浏览器会单独开辟出一个异步线程处理,处理完毕后,加入任务队列,等待JS主线程调用执行。
例如:12345678setTimeout(()=>console.log('触发了'),0);console.log('我先触发');// 输出/*我先触发触发了*/
虽然setTimeout()被设置为马上触发,但是setTimeout触发的异步任务需先放在任务队列中,等主线程中console()函数执行完毕后,再能被触发。
JavaScript执行环境(浏览器)是从头到尾一行一行往下执行,但是遇到异步任务,先放入任务队列,等待主线程可以执行该任务,才被执行。
详细的JS代码执行顺序可查看 https://juejin.im/post/59e85eebf265da430d571f89
异步程序在JS代码中很常见,因为Web应用总归要与远方的服务器交互,请求数据,这个过程需要异步进行。否则,浏览器会一直卡住,直到结果请求完毕。
我们先看一 ...
LeetCode 72.编辑距离
编辑距离给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
插入一个字符删除一个字符替换一个字符示例 1:123456输入: word1 = "horse", word2 = "ros"输出: 3解释: horse -> rorse (将 'h' 替换为 'r')rorse -> rose (删除 'r')rose -> ros (删除 'e')示例 2:12345678输入: word1 = "intention", word2 = "execution"输出: 5解释: intention -> inention (删除 't')inention -> enention (将 'i' 替换为 'e')enention -> exention ...
再见2019,你好2020!
这里有东西被加密了,需要输入密码查看哦。
LeetCode 474.一和零
题目在计算机界中,我们总是追求用有限的资源获取最大的收益。
现在,假设你分别支配着 m 个 0 和 n 个 1。另外,还有一个仅包含 0 和 1 字符串的数组。
你的任务是使用给定的 m 个 0 和 n 个 1 ,找到能拼出存在于数组中的字符串的最大数量。每个 0 和 1 至多被使用一次。
注意:12给定 0 和 1 的数量都不会超过 100。给定字符串数组的长度不会超过 600。
示例 1:1234输入: Array = {"10", "0001", "111001", "1", "0"}, m = 5, n = 3输出: 4解释: 总共 4 个字符串可以通过 5 个 0 和 3 个 1 拼出,即 "10","0001","1","0" 。
示例 2:12输入: Array = {"10", "0", "1"} ...




