【求助】救命啊,要被导师骂了,各路英雄救救小弟!

一个整数拆分成已知的一组数的和,可以不全取到。
(我的代码生成不了要的答案,需要高手帮忙优化更正一下)
#include <stdio.h>
#include <conio.h>
#define N 6
int a[N+1]={1,57,71,87,97,99,101};
int b[N+1],results=0,mole=580;
int back[N+1]={0};
int c[N+1][20]={0};
void Comout()
{    int i,j=0,k;
    int d[N+1]={0};
    for(i=1;i<=N;i++)
    for(k=1;k<=N;k++) if( c[k]!=0){d=k;break;}
    for (k=1;k<=N;k++) if(d[k]!=back[k]){j=1;break;}
    if(j==1)
    {    for(i=1;i<=N;i++)
            if(d!=0)
            {printf("{%d,%d}",a,d);back=d;}
        results++;printf("\n");
    }

}
void Searchans(int acidnum,int line)
{    int i,k;
    if(acidnum>0)
        {
            for(i=1;i<=b[line];i++)
            {    {c[line]=1;
                mole-=a[line]*i;}
                /*k=acidnum-i*/
                if((k=acidnum-i)>=0)
                {
                    Searchans(k,line+1);
                    {c[line]=0;
                    mole+=a[line]*i;}
                    Searchans(acidnum,line+1);
                }
                else
                {    {c[line]=0;
                    mole+=a[line]*i;}
                    Searchans(acidnum,line+1);
                    break;
                }
            }
        }
    else    if( mole==0) Comout();
}

        void Find()
        {    int i;
               /*    mole-=18;*/
            for(i=1;i<=N;i++) b=mole/a;
        }

        void Finals()
        {    printf("ans is :%d\n",results);}

        void Getmole()
        {    printf("please enter the mole:");
            scanf("%d",&mole);
            /*printf("mole is %d\n",mole);*/
        }
        void Making()
        {    int i,j,k;
            for(j=0;j<=N;j++)
            for(i=b[j]+1;i<20;i++) c[j]=-1;
            for(k=0;k<=N;k++)c[k][0]=-1;
        }
void main()
{      int i,line,j;
    clrscr();
    /*Getmole();*/
    Find();
    Making();
    for(j=1;j<=N;j++) if(b[j]!=0) {line=j;break;}
    for(i=b[N];i<=b[1];i++)    Searchans(i,line);
    Finals();
}
最后编辑2005-07-30 21:02:38