题的来源是棋牌游戏的人物的一个技能:
严教:出牌阶段限一次,你可以选择一名其他角色。从牌堆顶亮出四张牌,该角色将这些牌分成点数之和相等的两组,你与其各获得其中一组,然后将剩余未分组的牌置入弃牌堆。若未分组的牌超过一张,你本回合手牌上限-1 。
给定 x 张牌,每张牌的点数都在 1-13 之间. 将 x 张牌分成点数相等的两堆,弃置多余的牌,要求弃置最少的牌.
仅考虑拿尽量多的牌的算法,
如果要考虑牌本身的好坏,那么肯定还要考虑拿牌的人的技能,场上的局势等等才行
所以如果只是给予酒,桃,高收益锦囊,等等这样的牌高权重其实并不合理
每张牌都有三种状态:给第一个人,给第二个人,弃置
直接一个熟悉的回溯,算法复杂度高达 3 的 N 次方,这也是想优化的直接原因
其次还有个重复问题没有解决,
考虑点数 A,2,3,4 的情况,
第一个人拿 A,4,第二个人拿 2,3,
第一人拿 2,3,第二个人拿 A,4
印象中,去重还可以顺带达到剪枝效果。
定义数组 dp, dp.i 表示 bag1 中的元素和-bag2 元素和==i 的所有可能组合,
遍历到第 n 张牌时, 更新当前 dp 数组
dp[0+n] += 第 n 张牌分别放入 dp[0]中的 bag1 产生的新的组合
do[1+n] += 第 n 张牌分别放入 dp[1]中的 bag1 产生的新的组合
//然后更新将其放入 bag2 中的组合
最后 dp0 即为解
时间复杂度不知道怎么怎么算,想知道有没有更好的解决思路. 因为跟背包问题看起来类似,所以强行套了 dp
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.