题意:
求将n分成若干个正整数的本质不同的方案数.
n<=5e3
解法:
为了防止重复计数,考虑让拆出的数有序.
解法1:
d[i][j]表示要组成i,选择的数字必须<=j的方案数.
转移:
如果不拆出j,那么方案数d[i][j-1]
如果拆出j,那么方案数位d[i-j][j]
解法2:
完全背包,问题抽象为有无限个[1,n]可以取,
组成n的方案数,
只需要从小到大枚举物品进行背包转移即可,这样正好做到了拆出的数字有序.
ps:
由于这题需要大数,解法1似乎会超内存(RE了),
代码是解法2.
code:
maxm=5005
d=[0 for i in range(maxm)]
def init():
d[0]=1
for j in range(1,maxm): #从小到大枚举数字,等价于从小到大取
for i in range(j,maxm): #完全背包
d[i]+=d[i-j]
init()
while True:
try:
n=int(input())
print(d[n])
except:
break