題解:
暴力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;