最小数值中的最大组数
2021-3-23 9:32:50
收藏:0
阅读:145
评论:1
我正在使用Lua为RPG创建宏,在其中我需要获取具有一堆骰子的最多组。为了形成一组,数据必须加起来等于每组的最小值,并且可能超过这个最小值。
例如:1, 2, 4, 5, 5, 6, 7, 10,最小值为10,则为:6+4, 5+5, 7+1+2, 10。
我将每个骰子的结果分组到数组中,并取出可以自行形成组的数据:
for i=#dice, 1, -1 do
table.sort(dice);
minimo = tonumber(minimum)
if dice[i] >= minimum then
stack.Total = stack.total+1;
table.insert(stack.dice, 1, math.floor(dice[i]))
table.remove(dice, i);
end;
end;
它不必是Lua,只要有一些数学公式就能帮助大家
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

下面是一个有效的递归解决方案。它可能不如解决混合整数规划问题的方案那么可扩展,但它简单,不需要外部库。你可能可以通过记忆化来使它更快,但代价是很多内存。
核心思想是:形成所有满足最低限度的可能组合;对于每个这样的组,使用剩余的掷骰子最大化组数;选择最佳解决方案。其余的是优化。
第一个优化是仅循环一些组。因为我们可能会将每个骰子都放入一个组中,所以最大的骰子就在某个组中。为了避免循环所有组的排列,仅枚举那个组的可能性。
第二个优化是在找到可证明的最佳解后停止搜索。很明显,我们不能使组数多于最低限度总和的底部。如果我们达到了这个数字,就不能再进一步提高。
第三个优化是避免枚举重复的组。当我们减少“i”时,我们考虑的组不包括该位置的元素。为避免重复,我们跳过与我们刚刚拒绝的元素相同的元素。
在Python 3中:
def all_groups(minimum, rolls, j): roll = rolls[j] if minimum <= roll: yield [roll], rolls[:j] else: i = j - 1 while i >= 0: for group, rest in all_groups(minimum - roll, rolls, i): group.append(roll) rest.extend(rolls[i + 1 : j]) yield group, rest while i > 0 and rolls[i - 1] == rolls[i]: i -= 1 i -= 1 def max_groups_helper(minimum, rolls, lower_bound=0): upper_bound = sum(min(roll, minimum) for roll in rolls) // minimum if upper_bound < lower_bound: return None if upper_bound <= 0: return [] best = [] for group, rest in sorted( all_groups(minimum, rolls, len(rolls) - 1), key=lambda group_rest: sum(group_rest[0]), ): candidate = max_groups_helper(minimum, rest, max(lower_bound - 1, len(best))) if candidate is None: continue candidate.append(group) best = candidate if len(best) >= upper_bound: break return best def max_groups(minimum, rolls): assert minimum > 0 rolls = list(rolls) return max_groups_helper(minimum, rolls, 0)