01背包

初学树型dp

半世苍凉 提交于 2019-11-28 06:11:21
树型DP DFS的回溯 是树形DP的重点以及核心, 当回溯结束后,root的子树已经被遍历完并处理完了。 这便是树形DP的最重要的特点 自己认为应该注意的点 好多人都说在更新当前节点时,它的儿子结点都给更新完了,实际上这并不准确。对于当前节点,我们需要dfs它的儿子,并且在dfs中进行dp。在此过程中并不是等到儿子都更新完我们才更新当前节点的信息(假设当前节点为x, 有儿子son1 , son2, son3, 且son1已经更新完了, 即x已有了son1的信息, son2刚刚更新完,即dfs正在son2的位置回溯), 我们拿着son2, x和son1的信息再次更新x, 如此,x才有了son1,son2的综合信息,之后再从son3 dfs进去找son3的信息,最后才得到x的信息。 需要注意枚举的顺序,树型dp有点像01背包,而01背包更新信息时你如果没有记录对于i,i中前j个的状态,你就需要倒序枚举,而树型dp中通常直接用f[x] [...]...表示x所在子树的信息,这里枚举k的时候就需要像01背包一样了,从size[x]逆序枚举。 ( 01背包倒着写时要倒序 , 不然就表示 可以 多次使用前面的物品 更新后面的物品的状态(比如你顺着写,你 第j个物品用到了前j个物品来更新 ,那 当你再用第j个物品更新第j+1个物品 时, 又把前面的算了一遍 ,所以就算重复了)

背包

老子叫甜甜 提交于 2019-11-27 12:38:49
01背包 定义: 有N件物品和一个容量为V的背包。 每种物品只有一件,选或者不选 ,第i件物品的体积是w[i],价值是v[i]。求解将哪些物品装入背包可使这些物品的体积总和不超过背包容量,且价值总和最大。 实现: 令dp[i][j]表示选择前i件物品,背包体积为j时的最大价值。 因为01背包中每件物品只有选和不选两种状态,所以状态方程比较容易实现: ①如果不放第i件物品,则dp[i][j]=dp[i-1][j]直接转移。 ②如果放第i件物品,则dp[i][j]=dp[i-1][j-w[i]]+v[i]。 可以看出,当背包容量小于当前物品体积时,只能放弃此物品。反之,可以选择放或不放。 此方法的时间和空间复杂度都为 O(N*V) 。时间复杂度已经不能再优化了,但空间复杂度可以优化到 O(V) 。 可以看到,dp[i][j]的更新只涉及到dp[i-1][],也就是说dp[i][j]的更新只涉及到dp[][]数组中第(i-1)行,(i-1)行之前的数据就没有什么用了。 可以看到dp[]数组降成了一维。与此同时需要注意的是,第二层循环成了逆序。因为旧方法中更新dp[i][]数组第i行时,dp[i-1][]的值都不会再改变了,如果第二层循环为顺序的话,那么在更新dp[j]时用到的dp[j-w[i]]在之前很可能已经被改变。所以为了保证在优化空间复杂度的同时保证正确性,把第二层循环改成逆序。

用coffee和socket.io实现的01背包算法

房东的猫 提交于 2019-11-27 09:18:12
#先说说我为什么写这些吧 当程序猿太苦逼了,真的,时间久了,真没有搬砖的成就感高,好歹人家能盖栋楼(身材也能练得不错),咱们指不定哪天来个熊孩子把硬盘格了就啥也没了。 这学期明显没把心放在前端上......汗啊,将来还想吃着口饭呢,但是这学期绝对没休息,只是忙了很多可能很多人认为无聊的事。 因为这学期无聊事太多了,耽误了很多,也让导师很失望,自己也很自卑,整理一下调调心态。 因为很多是针对作业的奇葩想法,所以,作业嘛,不糊弄就不是作业了,还希望大家多多批评。 兴许因为哪篇文章能解决工作呢。 我想试试Markdown。 #靓照一张 #进入正题 ##后台实现部分: io = require "socket.io" http = require "http" fs = require "fs" express = require "express" mime = require "mime" app = express() server = http.createServer app server.listen 8080 console.log "Listening 8080" app.get "/",(req,res)-> path = "#{__dirname}/console.html" res.writeHead 200,"Content-Type":mime.lookup

动态规划之背包问题

白昼怎懂夜的黑 提交于 2019-11-26 19:24:41
动态规划之背包问题 01背包问题 问题1 为什么01背包问题可以用一维数组来优化? 问题2 使用一维数组优化过程中为什么物体的重量要从大到小枚举? code1 code2 code3 code(一维数组优化) 01背包问题 问题1 为什么01背包问题可以用一维数组来优化? 用二维数组枚举如下: 所以在枚举过程中仅用到上一行的数据,所以可以用一维数组来优化。 问题2 使用一维数组优化过程中为什么物体的重量要从大到小枚举? 我从大到小枚举如下: 我从小到大枚举如下: code1 #include<iostream> #define N 6 #define W 21 int B[N][W] = { 0 }; int w[6] = { 0, 2, 3, 4, 5, 9 }; int v[6] = { 0, 3, 4, 5, 8, 10 }; void knapsack() { int k, C; for (k = 1; k < N; k++) { for (C = 1; C < W; C++) { if (w[k] > C) { B[k][C] = B[k - 1][C]; } else { int value1 = B[k - 1][C - w[k]] + v[k]; int value2 = B[k - 1][C]; if (value1 > value2) { B[k][C] =