【语法】
一、隐蔽陷阱
一辆运货马车容量 20 格,三类货各自占格与价值不同,怎么装出最高价值?逐个组合枚举要 2^n 次,10 类货就是 1024 次起步,有没有按容量递推的解法?
二、底层原理
核心一行:逐类货物滚动更新"各容量下的最大价值"。对每类货,容量 j 要么不装它保持原值,要么腾出 w[i] 格装入得 v[i],两相比较取大。逆序遍历容量保证每类只装一次。
三、正确代码
基础写法(二维表逐步推):
local function pack2D(w, v, cap)
local f = {}
for i = 0, #w do f[i] = {} end
for i = 1, #w do
for j = 0, cap do
f[i][j] = (f[i - 1] or {})[j] or 0
if j >= w[i] then
local take = (f[i - 1][j - w[i]] or 0) + v[i]
if take > f[i][j] then f[i][j] = take end
end
end
end
return f[#w][cap]
end
进阶写法(一维滚动省空间):
local function pack1D(w, v, cap)
local f = {}
for j = 0, cap do f[j] = 0 end
for i = 1, #w do
for j = cap, w[i], -1 do
f[j] = math.max(f[j], f[j - w[i]] + v[i])
end
end
return f[cap]
end
local p = getplayerbyname("cargo01")
sendmsg(p, 1, "最高价值 " .. pack1D({5, 8, 9}, {10, 16, 18}, 20))
四、引擎验证
容量 20、占格 5/8/9、价值 10/16/18 的样例输出 34(选 8 格与 9 格两类);一维滚动比二维表省约一半内存。
五、FAQ
问:每类能装多件吗?
答:内层改正序遍历即为可重复装载版。
问:要输出装了哪些?
答:转移时记录来源,结算后回溯清单。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏】 一、规则机制 线上事故:玩家装备耐久打空才发现,战力拦腰砍半,打不动怪又投诉掉率。耐久提醒立双档:耐久低于三成弹黄…
【语法】 一、机制原理 抛个坑:行列表格要变成列行,每格都搬一遍还新建了整张表——方形矩阵能不能原地换?转置沿对角线折返:只…
【游戏】 一、规则机制 隐蔽的坑:"最近浏览"里同一件商品重复出现五六次,足迹成了复读机。浏览足迹立两条:每次查看先在足迹里…
【语法】 一、机制原理 一行代码拆解:local bucket = math.floor(v / width)。数值分布统计…
【语法】 一、机制原理 一行代码拆解:setmetatable(cfg, {__index = DEFAULTS})。配置对…
【游戏】 一、规则机制 线上事故:结算时玩家追问"我到底打了多少",战斗中没有任何实时输出面板,事后对不上账。输出统计两步走…