这题是在01背包问题的基础上,扩充了重量,需要用时间换空间. 思路: 1.仔细看题,注意到重量wi为a*2^b(a<=10,b<=30),很容易想到要按 b 分开做背包的DP.接下来的重点就是怎么使DP从b-1继承到b. 2.再仔细看题,发现只有一次询问,那么就可以在这个W上做文章--依W的大小进行所有的DP.由于是按b的大小进行DP,所以把数都看成二进制位来继承和转移,每对一组 b 相同的数做完后,就略去这一二进制位. 实现: 1."去位":若W的二进制数上第 i 位为1…
跑了7000ms... 这是个体积和价值都超大的背包.但是体积保证为a*2^b的(a<=10,b<=30)形式.且n<=100. 于是可以想到按b来分组.这样的话每组最多为a*n*2^b的体积.把每个分组进行一次01背包. 令dp[i][j]表示体积为j*2^i+w&(1<<i)的最大价值.再把每个分组背包做一次01背包,随便转移一下就行了. # include <cstdio> # include <cstring> # include &l…