按你题目的意思不是正数.....是非负数....就是可以有一个0对吧 比如5=5+0
这是一个整数划分的问题,你问的其实是把5这个整数划分成0到5的加数的和的方法数
我假设一个函数f(n,m)表示我要将n这个整数划分成 加数最大可能是m(可以不到达m)的 方法数
也就是说你这题目问的其实就是f(5,5) (意思是将5划分,加数最大可能是5(也可以不到达5))
我现在提出一个普遍性的求任何f(n,m)的算法
1.首先我们看f(n,1) 很明显 这样只能是n个1相加 故f(n,1) = 1
2.然后我们看f(n,m) (m大于等于n) 很明显 加数不能超过总和
故在m大于等于n时f(n,m) = f(n,n)
3.接着我们考虑f(n,n) f(n,n) = 1 + f(n,n-1) 下面解释为什么
我们想一下要将100写成一些不大于100的数的和的形式的方法数,就是f(100,100)
假设我们已经知道将100写成一些不大于99的的数的形式的方法数,就是f(100,99)
他们之间有什么关系? 很明显f(100,100)中包括了f(100,99)和100 = 100 + 0的两种情况
故f(100,100) = f(100,99) + 1 从这个例子f(n,n) = 1+f(n,n-1)就好理解了吧
4.然后我们考虑f(n,m) (m小于n) f(n,m) = f(n,m-1)+f(n-m,m)下面解释为什么
我们想想f(100,40) f(100,40)包括两种情况
a.f(100,39) 和 b.把100写成最大加数一定为加数为40(注意是一定)
在情况b中,100 最大的加数一定为40 等价于 60写成最大加数小于等于40的形式
故f(100,40) = f(100,39) + f(100-40,40);
从这个例子可以理解f(n,m) = f(n,m-1)+f(n-m,m)
综上f(n,m)有以下4种情况
f(n,m)=1 当n=1或m=1时 法则A
f(n,m)=f(n,n) 当m>n 法则B
f(n,m)=1+f(n,n-1) 当n=m 法则C
f(n,m)=f(n,m-1)+f(n-m,m) 当m
f(5,5)
=1+f(5,4).....................................................利用法则C
=1+[f(5,3)+f(1,4)].........................................利用法则D
=1+[f(5,3)+1]=2+f(5,3).................................利用法则A
=2+[f(5,2)+f(2,3)].........................................利用法则D
=2+[f(5,2)+f(2,2)].........................................利用法则B
=2+[f(5,2)+f(2,1)+1]=3+f(5,2)+f(2,1)............利用法则C
=3+f(5,2)+1=4+f(5,2)...................................利用法则A
=4+f(5,1)+f(3,2)...........................................利用法则D
=4+1+f(3,2)=5+f(3,2)...................................利用法则A
=5+f(3,1)+f(1,2)...........................................利用法则D
=5+1+1=7....................................................利用法则A
一楼的答案是错的 比如1+1+1+1+1就没有算到
按照我的算法 可以计算任意f(n,m)
编程的话你可以用递归函数的方法 函数体很短 几行就行
这个必须是正数吗?如果不是正数就很多了
1+1+3=5
答案有超过100余种。没时间一一写出来。