题解:
暴力50%(不过我50不是暴力,而是数据开小了):
把它当成一个无脑 的暴力01背包问题,把个当成单纯的个,时间复杂度为O(* *)。
二进制优化背包100%:
如果想让个不是单纯的个,那就需要二进制优化。
首先,我们知道20+21+……2n=2n+1-1,且用20,21……2n,可以组成2n+1以下的所有整数,且绝不超2n+1。
然后,根据上面的的定理,我们就能得到2n+1-1的优化,但别的呢???
我们再放一个-(2n+1-1),再配上前面的就可以组成别的数了。
放一个二进制优化的代码:
int q=read(),p=read(),k=1;
while(k<=p){
w[++w[0]]=k*q;
p-=k;
k*=2;
}
if(p!=0)
w[++w[0]]=p*q;