//就是把一个大问题划分成几个子问题,不断递归,应该不难理解,还有就是输入10000估计要废掉,内存吃不消,一般的可以计算,如果计算打算,把int 全定义 unsigned __int64,那么输出就是 printf("%I64u",); 的形式
#include
int q(int n,int m)
{
if(n<1 || m<1) return 0;
if((n==1) || (m==1)) return 1;
if(n
return q(n,m-1)+q(n-m,m);
}
void main()
{
int n;
scanf("%d",&n);
printf("p(%d,%d)=%d\n",n,n,q(n,n));
}
n个一吗?话说只需要把这一堆一组合下看有多少种组合方法就好了吧?就是计算量比较大吧,还有循环次数相对较多,要是有几个整数的限制就好计算点了,而且这个正整数还不能太大
for后面应该是从0开始循环吧?
l=1
for(u(l)=0;i<=n/l;i++)
{l=1
p(l)=l++
if(n>=l)
for(u(l)=0;i<=n/l;i++)
{l=1
p(l)=l++
if(n>=l)
for(u(l)=0;i<=n/l;i++)
{l=1
p(l)=l++
if(n>=l)
......
{q=0
for(t=1;t<=n;t++)
q=q+p(t)*t
if(q==n)
sum++;}
这样子吧,前面的判断语句和循环语句多次调用,可以设成一个函数多次调用的,当然过程中需要设置全局变量什么的,这个思路应该比较正确了吧,也就是说n等于几就调用多少次那个函数
也就是n
思路就这样,程序没编完编了半个小时了都,现在没时间了回来继续编。。。当然你要是看懂了的话我就不继续编了,也就是剩下把那个循环体弄成个函数的样子
可以用穷举法
比如5嘛
就可以用for(i=1;i<=5;i++)
for(j=1;j<=3;j++)
for(k=1;k<=1;k++)
if(1*i+2*j+3*k==5)
sum++
这样计算出来的sum就是总的划分方法
但是我感觉你这个题目好像有问题
比如说数字很大的时候
那么划分方法很多的