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

先说说我为什么写这些吧

  • 当程序猿太苦逼了,真的,时间久了,真没有搬砖的成就感高,好歹人家能盖栋楼(身材也能练得不错),咱们指不定哪天来个熊孩子把硬盘格了就啥也没了。
  • 这学期明显没把心放在前端上……汗啊,将来还想吃着口饭呢,但是这学期绝对没休息,只是忙了很多可能很多人认为无聊的事。
  • 因为这学期无聊事太多了,耽误了很多,也让导师很失望,自己也很自卑,整理一下调调心态。
  • 因为很多是针对作业的奇葩想法,所以,作业嘛,不糊弄就不是作业了,还希望大家多多批评。
  • 兴许因为哪篇文章能解决工作呢。
  • 我想试试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(path)
    res.end fs.readFileSync path

    app.get “/jquery.min.js”,(req,res)->

    path = "#{__dirname}/jquery.min.js"
    res.writeHead 200,"Content-Type":mime.lookup(path)
    res.end fs.readFileSync path

    app.get “/bootstrap.min.js”,(req,res)->

    path = "#{__dirname}/bootstrap.min.js"
    res.writeHead 200,"Content-Type":mime.lookup(path)
    res.end fs.readFileSync path

    app.get “/bootstrap.min.css”,(req,res)->

    path = "#{__dirname}/bootstrap.min.css"
    res.writeHead 200,"Content-Type":mime.lookup(path)
    res.end fs.readFileSync path

    getCurrentTime = ->
    d = new Date()
    return “#{d.getFullYear()}-#{d.getMonth()+1}-#{d.getDate()} #{d.getHours()}:#{d.getMinutes()}:#{d.getSeconds()}”

    class dynamicPack

    pack:(data)->
        c=[]
        i=0
        j=0
        while i<data.m+1
            c[i]=[]
            c[i][0]=0
            i++
        while j<data.n+1
            c[0][j]=0
            j++
        i=1
        while i<data.m+1
            j=1
            while j<data.n+1
                if data.w[i-1]<=j
                    if c[i-1][j]<c[i-1][j-data.w[i-1]]+data.v[i-1]
                        c[i][j]=c[i-1][j-data.w[i-1]]+data.v[i-1]
                    else
                        c[i][j]=c[i-1][j]
                else c[i][j] = c[i-1][j]
                j++
            i++
        return c;
    print:(c,data)->
        x = []
        i = data.m
        n = data.n
        str = ""
        #console.log c[i][m]
        while i>0
            if  c[i][n] > c[i-1][n]
                x[i-1] = 1
                n -= data.w[i-1]
            else x[i-1] = 0
            i--
        i= 0
        count = 0
        while i<data.m
            count += x[i]*data.v[i]
            str += (i+1)+"," if x[i]!=0
            i++
        return str+"共计价值#{count}"

    class knapPack

    pack : (data)->
        @v = data.v
        @w = data.w
        @m = data.m
        @n = data.n
        @cw = 0
        @cv = 0
        @put = []
        @bestp = 0
    
        temp_order = 0;
        temp = 0
        perp = []
        i=0
        while i<@m
            perp[i] = @v[i]/@w[i]
            @put[i] = 0;
            i++
        console.log perp
        i=0
        while i<@m
            j=i+1
            while j<@m
                if perp[i]<perp[j]
                    temp = @v[i]
                    @v[i] = @v[j]
                    @v[j] = temp
    
                    temp = @w[i]
                    @w[i] = @w[j]
                    @w[j] = temp
                j++
            i++
    backtrack : (i)->
        console.log i
        @bound i
        if i>@m
            @bestp = @cv
            return
        if @[email protected][i]<[email protected]
            @[email protected][i]
            @[email protected][i]
            @put[i]=1
            @backtrack(i+1)
            @[email protected][i]
            @[email protected][i]
        if @bound(i+1)>@bestp
            @backtrack(i+1)
    bound :(i)->
        leftw = @n - @cw
        b = @cv
        while i<[email protected] and @w[i]<=leftw
            leftw -= @w[i]
            b += @v[i]
            i++
        [email protected][i]/@w[i]*leftw if i<@m
        return b
    print :(data)->
        @pack(data)
        console.log @w
        console.log @v
        @backtrack(0)
        console.log @put
        return @bestp

    dask = (msg)->

    answer = ""
    data = JSON.parse msg
    console.log data
    
    d = new dynamicPack()
    console.log d.pack(data)
    answer += "动态规划,选择物品"+d.print d.pack(data),data
    return answer

    kask = (msg)->

    answer = ""
    data = JSON.parse msg
    console.log data
    
    k = new knapPack()
    answer += "分支限界,最优解"+k.print data
    return answer

    io.listen(server).on “connection”,(socket)->

    socket.on "msg",(msg)->
        ##console.log msg
        socket.emit "msg",{time:getCurrentTime(),text:"calculating..."}
        socket.emit "msg",{time:getCurrentTime(),text:dask(msg)}
        socket.emit "msg",{time:getCurrentTime(),text:kask(msg)}
        ##socket.broadcast.emit "msg",data
    
    console.log "#{getCurrentTime()}:Connected"

    前端实现部分:

    • 输入示例:{"n":10,"m":3,"w":[3,4,5],"v":[4,5,6]}其中n为背包容量,m为物品数量

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

时间: 2024-08-05 21:58:23

用coffee和socket.io实现的01背包算法的相关文章

01背包算法的理解

01背包问题: 有N件物品和一个最大重量限制为V的背包.第i件物品的重量是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的重量总和不超过V,且价值总和最大.每个物品只有1份,且不可分割 看了01背包算法,言简意赅,但理解起来头昏脑胀,不得要领.尝试解释下对该算法的理解,加深记忆. 假设最优解已经存在,怎么判断一个物品i是否在背包里?  简单,只要知道, 1.c[i]是否大于V, 2.F[i-1][V-c[i]],即没有i物品的情况下,最大重量限制为V-c[i]的最优解. 3.F[i

01背包算法

转:01背包问题 动态规划的基本思想: 将一个问题分解为子问题递归求解,且将中间结果保存以避免重复计算.通常用来求最优解,且最优解的局部也是最优的.求解过程产生多个决策序列,下一步总是依赖上一步的结果,自底向上的求解. 动态规划算法可分解成从先到后的4个步骤: 1. 描述一个最优解的结构,寻找子问题,对问题进行划分. 2. 定义状态.往往将和子问题相关的各个变量的一组取值定义为一个状态.某个状态的值就是这个子问题的解(若有k个变量,一般用K维的数组存储各个状态下的解,并可根    据这个数组记录

0-1背包的动态规划算法,部分背包的贪心算法和DP算法------算法导论

一.问题描述 0-1背包问题,部分背包问题.分别实现0-1背包的DP算法,部分背包的贪心算法和DP算法. 二.算法原理 (1)0-1背包的DP算法 0-1背包问题:有n件物品和一个容量为W的背包.第i件物品的重量是w[i],价值是v[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大.其中每种物品只有一件,可以选择放或者不放. 最优子结构性质:对于0-1问题,考虑重量至多W的最值钱的一包东西.如果去掉其中一个物品j,余下的必是除j以外的n-1件物品中,可以带走的重量

[Node.js] 基于Socket.IO 的私聊

原文地址:http://www.moye.me/2015/01/02/node_socket-io/ 引子 最近听到这么一个问题:Socket.IO 怎么实现私聊?换个提法:怎么定位到人(端),或者说怎么标识到连接,而不是依赖每个连接的socket.id.好问题. 在 Socket.IO Real-Time Web Application Development的指引下,形成了如下思路: 服务端在每个用户初次进入系统时,产生session_id 服务端强制用户输入昵称,与session_id对应

Socket.io 延伸

项目正好用到了即时通讯功能,于是研究到了webSocket技术,后来发现了可以在web.[Android].[iOS]上同时使用的解决方案,那就是SocketIO.其实现原理啥的不做介绍了,直接贴上IOS项目可能会用到的一些资源. 首先是官网:http://socket.io/这个大家都不会陌生吧~~ 1.官方推荐的Android项目:http://socket.io/blog/native-socket-io-and-android/ github上的相应地址为:https://github.

socket.io实现在线群聊

我自己在用socket.io开发,对官方网站上的文档,进行简单的整理,然后自己写了一个简单的聊天程序.最最开始 先安装socket.io: 1 npm install socket.io 利用Node的搭建Http服务 分为两个文件,服务端文件app.js和客户端index.html app.js 01 var app = require('http').createServer(handler)02 , io = require('socket.io').listen(app)03 , fs

GO语言 --socket.io

socket.io是对websocket的封装以及扩展, 可以跨平台使用, 具体可看官网.. GO语言实现: package main import ( "github.com/googollee/go-socket.io" "github.com/nicholaskh/log4go" "net/http" "os" "time" "path" "strings" &

使用node.js和socket.io实现多人聊天室

刚学node.js,想着做点东西练练手.网上的东西多而杂,走了不少弯路,花了一天时间在调代码上.参考网上的一篇文章,重写了部分代码,原来的是基于基于node-websocket-server框架的,我没用框架,单单是socket.io. 一.基本功能 1.用户随意输入一个昵称即可登录2.登录成功后1) 对正在登录用户来说,罗列所有在线用户列表,罗列最近的历史聊天记录2) 对已登录的用户来说,通知有新用户进入房间,更新在线用户列表3.退出登录1)支持直接退出2) 当有用户退出,其他所有在线用户会收

socket.io与sticky-session, 多个socket.io实例带来的问题

websocket的出现使得从服务器向浏览器推送数据更加容易.但是低版本的浏览器不支持websocket,这时socket.io出现了. 使用socket.io的应用在支持websocket的浏览器运行的时候使用websocket,而在低版本的浏览器中则使用传统的方式与服务器交互(例如long-polling及其他的方式). long-polling的应用实现方式是这样的,客户端向服务器端发起请求,服务器端不会马上返回,而是保持这个连接直到服务器需要推送信息给客户端时,才返回给客户端数据.客户端