輸入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();
}