数组求和的一个解法

时间:2022-09-12 08:53:47
       在csdn 看到了这样一个问题:
给定一个整形数组和一个整形数,求出数组中的数相加等于给定整形数的所有组合
如int a[4]={1,2,5,10},int sum=100
组合如下:
1,1.........(100)/*100个1*/
2,2..........(50)/*50个2*/
1,1,2,2......(2,49)/*2个1,49个2*/

      想到了这样的一个解法:
#include   < stdio.h >


void  output( int  os,  int  a[],  int  b[], int  n)
{
        
int  i,flag  =   0   ;
        printf(
" " );
        
for (i  =   0  ; i   <  n ; i  ++ )
        {
                
if (b[i]  ==   0 continue ;
                
if ( flag  ==   0 )
                {
                        printf(
"  %2d * %2d  " ,a[i] ,b[i]);
                        flag 
=   1 ;
                }
                
else
                        printf(
" + %2d * %2d  " ,a[i],b[i]);
        }
        printf(
" = %d " ,os);
}

void  calc( int  os,  int  s,  int  from,  int  a[],  int  n ,  int  b[])
{
        
int  i ;
        
if (s  ==   0 ) {
                output(os, a,b,n);
                
return  ;
        } 
else   {
                
for ( i  =  from ; i   <  n ; i  ++ ) {
                        
if (s  >=  a[i]) {
                                b[i] 
++  ;
                                calc(os, s 
-  a[i], i, a, n, b);
                                b[i] 
-- ;
                        }
                }
        }
}
int  main()
{
        
int  a[ 4 =  { 1 , 2 , 5 , 10  };
        
int  b[ 10 =  {  0  };
        
int  sum  =   100 ;
        calc(sum,sum,
0 , a, 4 ,b);
        
return   0 ;
}