传送门
dp好题。
我认为原题的描述已经很清楚了:
你有一个大小为n的背包,你有n种物品,第i种物品的大小为i,且有i个,求装满这个背包的方案数有多少。
两种方案不同当且仅当存在至少一个数i满足第i种物品使用的数量不同。
然而我只会 O ( n 2 ) O(n^2) O(n2)的做法。
然后通过搜题解学会了 O ( n ∗ s q r t ( n ) ) O(n*sqrt(n)) O(n∗sqrt(n))的做法。
简单讲讲。
首先我们需要分布考虑。
对于大于 s q r t ( n ) sqrt(n) sqrt(n)的物品是选不完的,相当于没有数量限制。
而小于 s q r t ( n ) sqrt(n) sqrt(n)的物品是有数量限制的。
但是直接上多重背包效率上天。
因此我们开始考虑如何优化。
先想想dp式子。
f [ i ] [ j ] = ∑ f [ i − 1 ] [ j − k ∗ i ] f[i][j]=\sum f[i-1][j-k*i] f[i][j]=∑f