//求给定数组中加和最接近目标值的组合 static int mid=0; #define MAXLEN 10 int Sum_All(int *p,int len) { int sum=0; for (int i=0;i<len;++i) { sum+=p[i]; } return sum; } int Sum_Value(int *p,int *map,int len) { int sum=0; for (int i=0;i<len;++i) { if (map[i]) { sum+=p[i]; } } return sum; } int Cnt_Map(int *map,int len) { int n=0; for (int i=0;i<len;++i) { if (map[i]) { ++n; } } return n; } int Show(int *p,int len,int tar,int *map) { printf("Target:%d/nResult:",tar); int n=Cnt_Map(map,len); for (int i=0;i<len;++i) { if (map[i]) { if (--n>0) { printf("%d+",p[i]); } else { printf("%d",p[i]); } } } printf("=%d/n",Sum_Value(p,map,len)); return 0; } int Cal_Map(int *p,int len,int tar,int n,int map[],int res[]) { int s=Sum_Value(p,map,len); int t=abs(tar-s); if (t<mid) { mid=t; memcpy(res,map,len*sizeof(int)); } if (s>=tar || mid==0) { return 0; } else { for (int i=n;i<len;++i) { map[i]=1; Cal_Map(p,len,tar,i+1,map,res); if (mid==0) { return 0; } map[i]=0; } } return 0; } int main() { int p[MAXLEN]={4,2,1,3,6,10,8,9,5,7}; int map[MAXLEN]={0}; int tar=100; mid=Sum_All(p,MAXLEN); int result[MAXLEN]={0}; Cal_Map(p,MAXLEN,tar,0,map,result); Show(p,MAXLEN,tar,result); return 0; }