C语言算法1
输入m和n(20>=m>=n>0),请编程求出满足以下方程的正整数数列i1,i2,....,in,使得:i1+i2+...+in=m,且i1>=i2...>=in。例如:输入n=4,m=8时,将得到如下5个数列:
5 1 1 1 4 2 1 1
3 3 1 1 3 2 2 1
2 2 2 2
--------------------------------------------------------------------------------
这是朋友问我的一道上机考试题。以下是我给出的答案,第二个在第一个下优化了一点,可以尝试输入较大的数比较一下算法优劣。
--------------------------------------------------------------------------------
#include "stdio.h"
int _m;
int _n;
int a[20];
void fun(int sum,int m,int n)
{
int i;
if(n<=0)
{
if(_m==sum)
{
for(i=0;i<_n;i++)printf("%4d",a[i]);
printf("\n");
}
return;
}
for(i=m;i>0;i--)
{
a[_n-n]=i;
fun(sum+a[_n-n],i,n-1);
}
}
void main()
{
_m=8;
_n=4;
fun(0,_m,_n);
getchar();
}
---------------------------------------------------------------------------
#include "stdio.h"
int _m;
int _n;
int a[20];
void fun(int sum,int m,int n)
{
int i;
for(i=m;i>0;i--)
{
a[_n-n]=i;
if(n-1==0 && sum+a[_n-n]==_m)
{
for(i=0;i<_n;i++)printf("%4d",a[i]);
printf("\n");
return;
}
else if(sum+a[_n-n]>=_m)continue;
else if(n-1>0) fun(sum+a[_n-n],i,n-1);
}
}
void main()
{
_m=20;
_n=11;
fun(0,_m,_n);
getchar();
}
posted on 2007-02-01 15:33 Kevin Shan 阅读(695) 评论(0) 编辑 收藏 举报