- #include <reg52.h>
- /*
- 有一组数据4,7,24,44,64,86,300,720。输入一个值比如400,
- 要求从上面8个值中选择若干个相加和最接近400,但不能超过400
- 并且要求在满足和最接近的条件下优先使用比400小,但是最接近400的值,
- 在这里就是300了。输入400的话应该是选择300+64+24+7+4=399,
- 因为如果选择了300+86,那剩下的只能选7和4了,300+86+7+4=397<399.
- */
- unsigned int code elem[]={720,300,86,64,44,24,7,4};
- unsigned int result[8];
- void split1(unsigned int x)
- {
- unsigned char i=0,j=0;
- for(i=0;i<8;i++){result[i]=0;}
- for(i=0;i<8;i++)
- {
- if(x>elem[i]){result[j]=elem[i];j++;x=x-elem[i];}
- }
- }
- unsigned int sum(unsigned int * arry)
- {
- unsigned char i=0;
- unsigned int sumval=0;
- for(i=0;i<8;i++)
- {
- sumval=sumval+arry[i];
- }
- return(sumval);
- }
- void split2(unsigned int x)
- {
- unsigned char i=0,j=0,Closest;
- unsigned int err,min_err=65535;
- for(i=1;i<8;i++){result[i]=0;}
- for(i=1;i!=0;i++)
- {
- if(i&0x80){result[0]=720;}else{result[0]=0;}
- if(i&0x40){result[1]=300;}else{result[1]=0;}
- if(i&0x20){result[2]=86;}else{result[2]=0;}
- if(i&0x10){result[3]=64;}else{result[3]=0;}
- if(i&0x08){result[4]=44;}else{result[4]=0;}
- if(i&0x04){result[5]=24;}else{result[5]=0;}
- if(i&0x02){result[6]=7;}else{result[6]=0;}
- if(i&0x01){result[7]=4;}else{result[7]=0;}
- if(sum(result)>=x)
- {
- continue;
- }
- else
- {
- err=x-sum(result);
- if(err<min_err){min_err=err;Closest=i;}
- }
- }
- if(Closest&0x80){result[0]=720;}else{result[0]=0;}
- if(Closest&0x40){result[1]=300;}else{result[1]=0;}
- if(Closest&0x20){result[2]=86;}else{result[2]=0;}
- if(Closest&0x10){result[3]=64;}else{result[3]=0;}
- if(Closest&0x08){result[4]=44;}else{result[4]=0;}
- if(Closest&0x04){result[5]=24;}else{result[5]=0;}
- if(Closest&0x02){result[6]=7;}else{result[6]=0;}
- if(Closest&0x01){result[7]=4;}else{result[7]=0;}
- }
- void main()
- {
- while(1)
- {
- split1(400);
- split2(400);
- }
- }
|