程序代码:
#include<stdio.h>
void sum_n(int *pres,int *pfm,int n,int i);
void generate(int *pres,int *ptemp,int *pfm,int n,int i_n,int i);
int test(int *ptemp,int i_n);
void to_res(int *ptemp,int *pres,int i,int add_minus_n);
int main()
{
int n,fm[100],res[95051],i,sum=0;
int *pfm;
for(i=0;i<95051;i++) {res[i]=0;}
pfm=fm;
printf("Input:\n");
scanf(" %i",&n);
if((n<1)||(n>100)) {puts("error!");}
for(i=0;i<n;i++)
{
scanf(" %i",pfm+i);
if((*(pfm+i)<1)||(*(pfm+i)>1000)) {puts("error!");}
}
if(n==1){printf("1\n");}
else
{
for(i=2;i<=n;i++)
{
sum_n(res,pfm,n,i);
}
for(i=0;i<n;i++)
{
res[*(pfm+i)]+=1;
}
for(i=0;i<95051;i++)
{
if(res[i]!=0) {sum+=1;}
}
printf("Output:\n%i\n",sum);
}
return 0;
}
/////////////////////////////////////////////////////////////
void sum_n(int *pres,int *pfm,int n,int i)
{
int temp[100];
generate(pres,temp,pfm,n,0,i);
}
/////////////////////////////////////////////////////////////
void generate(int *pres,int *ptemp,int *pfm,int n,int i_n,int i)
{
int ctr;
for(ctr=0;ctr<n;ctr++)
{
*(ptemp+i_n)=*(pfm+ctr);
if((i_n!=0)&&(test(ptemp,i_n)==0)){continue;}
if(i_n<i-1) {generate(pres,ptemp,pfm,n,i_n+1,i);}
if(i_n==i-1)
{
to_res(ptemp,pres,i,0,0);
}
}
}
/////////////////////////////////////////////////////////////
int test(int *ptemp,int i_n)
{
int i,res=1;
for(i=0;i<i_n;i++)
{
if(*(ptemp+i)==*(ptemp+i_n))
{
res=0;
break;
}
}
return res;
}
/////////////////////////////////////////////////////////////
void to_res(int *ptemp,int *pres,int i,int add_minus_n,int sum)
{
int add_minus,ctr;
for(add_minus=0;add_minus<2;add_minus++)
{
if(add_minus==1)
{
sum-=*(ptemp+add_minus_n);
}
else
{
sum+=*(ptemp+add_minus_n);
}
if(add_minus_n<i)
{
to_res(ptemp,pres,i,add_minus_n+1,sum);
}
if(add_minus_n==i-1)
{
if(sum>=0) {*(pres+sum)+=1;}
}
}
}