- 论坛徽章:
- 0
|
发个测试版的
- #include <stdio.h>
- #include <ctype.h>
- #include <math.h>
- #include <stdlib.h>
- #include <string.h>
- float list[]={47,33,22,22,10,5,4.7,7.2};
- int *result=NULL,*test=NULL;
- int list_size=8,result_size=0,test_size=0;
- float given_num,t,k;
- int i,j;
- int comp( const void *arg1, const void *arg2 )
- {
- if (list[*(const int *)arg1]>list[*(const int *)arg2]) return -1;
- if (list[*(const int *)arg1]<list[*(const int *)arg2]) return 1;
- return 0;
- }
- int compF( const void *arg1, const void *arg2 )
- {
- if (*(const int *)arg1>*(const int *)arg2) return -1;
- if (*(const int *)arg1<*(const int *)arg2) return 1;
- return 0;
- }
- int insertNum(int num)
- {
- int *temp;
- int i;
- for(i=0;i<result_size;i++)
- if (result[i]==num) return 0;
- temp=(int *)calloc(result_size+1,sizeof(int));
- if (temp==NULL)
- {
- fprintf(stderr,"memory overflow in insertNum, result size is %d\n",result_size);
- free(result);
- exit(1);
- }
- memcpy(temp,result,sizeof(int)*result_size);
- temp[result_size++]=num;
- free(result);
- result=temp;
- qsort(result,result_size,sizeof(int),comp);
- return 1;
-
- }
- int insertTestNum(float num)
- {
- int *temp;
- int i;
- for(i=0;i<test_size;i++)
- if (test[i]==num) return 0;
- for(i=0;i<result_size;i++)
- if (result[i]==num) return 0;
- temp=(int *)calloc(test_size+1,sizeof(int));
- if (temp==NULL)
- {
- fprintf(stderr,"memory overflow in insertNum, test size is %d\n",test_size);
- free(test);
- free(result);
- exit(1);
- }
- memcpy(temp,test,sizeof(int)*test_size);
- temp[test_size++]=num;
- free(test);
- test=temp;
- qsort(test,test_size,sizeof(int),comp);
- return 1;
-
- }
- float sumArray(int * array,int array_size)
- {
- int i;
- float sum;
- sum=0;
- for(i=0;i<array_size;i++) sum+=list[array[i]];
- return sum;
- }
- void showArray(int *array, int array_size)
- {
- int i;
- float sum;
- sum=0;
- for(i=0;i<array_size;sum+=list[array[i]],i++) printf("%3.3f ",list[array[i]]);
- printf("total:%3.3f\n",sumArray(array,array_size));
- }
- int main(void)
- {
- float sum;
- qsort(list,list_size,sizeof(float),compF);
- given_num=k=50;
- for (i=0;i<list_size;i++)
- {
- if (list[i]>k) continue;
- if (insertNum(i)) k-=list[i];
- }
- showArray(result,result_size);
- i=0;
- while(i<result_size)
- {
- if(test!=NULL) free(test);
- test_size=0;
- t=given_num-sumArray(result,result_size);
- k=list[result[i]]+t;
- for(j=result[i]+1;j<list_size;j++)
- {
- if (k<list[j]) continue;
- if (insertTestNum(j)) k-=list[j];
- }
- sum=sumArray(test,test_size);
- if (list[result[i]]<=t+sum && sum>list[result[i]])
- {
- for(j=0;j<test_size;j++)
- {
- if (j>0) insertNum(test[j]);
- else result[i]=test[j];
- }
- }
- if (k==0) break;
- i++;
- }
- showArray(result,result_size);
- if (result!=NULL) free(result);
- if (test!=NULL) free(test);
- }
复制代码 |
|