可以直接完全背包,复杂度 $O(n log n)$
考虑另一种比较神仙的做法
设 $f[i]$ 表示相加为 $i$ 的方案数
考虑某个方案中加的最小的数
当 $i$ 为奇数时,显然加的最小的数一定为 $1$,则 $f[i]=f[i-1]$
当 $i$ 为偶数时,把加的最小的数分为 $1$ 和大于 $1$,$1$ 的贡献同样是 $f[i-1]$
如果加的最小的数大于 $1$,又因为加的数都是 $2$ 的幂次,说明加的数都是偶数,则把加的数全部除以 $2$ 的方案同样合法
发现除以 $2$ 后的每个方案恰好对应 $f[i/2]$ 的每个方案
所以 $f[i]=f[i-1]+f[i/2]$
代码就不用了吧......