13 条回复  ·  1477 次点击
geelaw 小成 2025-4-8 22:42:12
问题意思不清楚,需要明确所要的分布,假设: - 红包金额必须是整数,m 是自然数. - 数据满足 m >= n 且 0.3m >= 1 (其他情况平凡). - 需要的分布是 X = { (a_1, ..., a_n) | a_i in Z, 1 <= a_i <= 0.3m, sum of a_i = m } 上的均匀分布. 又假设 m, n 不大(具体来说建模为关于 m, n 多项式时间可接受),那么最朴素的思路就是…… 固定 m, n 后,令 f(I, J) = |{ (a_1, ..., a_I) | a_i in Z, 1 <= a_i <= 0.3m, sum of a_i = J }|, 则 f(0, 0) = 1 且 f(0, J) = 0 对所有 J != 0 且 f(I, J) = sum of f(I - 1, J - a_I) over 1 <= a_I <= floor(0.3m). 考虑抽样算法 D(I, J) 表示“I 个人分配 J 元奖金”,则 D(I, J) 是: - 以 f(I - 1, J - x) / f(I, J) 的概率抽取 x ,其中 1 <= x <= 0.3m 且 x in Z . - 把 x 作为 a_I 输出. - 运行 D(I - 1, J - x). 所要求的就是运行一次 D(n, m). ———— 补充细节留给楼主:证明上述 D(n, m) 可以在 (m+n) 的多项式时间内完成.
tenserG 楼主 初学 2025-4-8 22:53:39
@Wxh16144 微信红包就是二倍均值法,估计标准答案就是二倍均值法跟线割法了。
geelaw 小成 2025-4-8 22:54:45
@geelaw #10 一个简单的优化:D(I, J) 均匀随机出来一个 1 到 f(I, J) 的整数,然后按照 f 做“进位制展开”即可得到一个样本,无需递归/重新采样子问题。
snailsir 初学 2025-4-8 23:05:04
https://mp.weixin.qq.com/s/tooCMin-kR1J9r4orOR5LQ
12
返回顶部