【日常练习】某种密码【折半搜索】

题解

不得不说这个题解思路的确很妙也许是我太弱了

首先考虑到是01串,所以每个数只有选或不选两种可能,所以……

这像不像01背包?很像啊!

看看数据范围,-maxint<ai<maxint。emm心凉了半截……

60pts

225 是可以接受的复杂度,枚举每种状态然后跟key值比较即可。

100pts

考虑到240 的复杂度我们肯定搜索过不去,但是220 完全没有问题啊。

so?

我们考虑折半搜索,暴力枚举前面和后面的每种状态及其贡献。处理前半段时,用map存下前半段的每个权值对应多少个状态,然后后半截枚举的时候映射查找一下。

由于需要的状态是:前半段贡献+后半段贡献=key

所以我们用:key-后半段贡献作为键值,在map里查找对应的状态个数,加到答案里面就可以啦~

一点扩展

做题的时候,我们首先考虑到了01背包,然后发现因为权值过大,我们不能用数组存下当前选取的物品的权值和,因此放弃。那以后遇到权值很大的01背包问题,我们该怎么解决呢?

这类问题中物品个数与普通01背包类似:
物品重量与背包容量极大,但物品单个价值较小,求装入背包的物品价值的最大值。
此类问题可以用DP求解,只是需要对状态进行些许修改。
设f [i] [j]为前ii个物品价值总量为j时所需的背包容量的最小值
状态转移方程为 f[i][j]=min(f[i−1][j] , f[i−1][j−c[i] ] + w[i])。
最后扫描f[n][i],找到最接近给定背包容量的ii输出即可。

总结

熟练运用STL库!熟练运用STL库!熟练运用STL库!

发布了44 篇原创文章 · 获赞 16 · 访问量 7271

猜你喜欢

转载自blog.csdn.net/Cyan_rose/article/details/83628801
今日推荐