这道题是一个简化版的“超大背包问题”,一开始我试图用各种剪支或者启发式搜索来完成,最后都发现这个NPC问题的解空间太大了。不过因为这道题数据太水的原因,所以记忆化剪支其实是可以在很快的时间内AC的,但并不是在。
我们来看一下这道题究竟应该如何优化。首先观察数据N最大为40,其实从这里就可以发现,如果我们将复杂度的量级缩小到2^20,指数级算法还是有希望通过的。
于是我们将数据分为两段,一端先通过暴搜储存在一个集合中,当我们通过暴搜每次找到第二段中的一个解时,再在前面的我们所储存的集合中使用二分查找找到一个满足条件的解与之搭配。
//http://paste.ubuntu.com/11689907/