#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);
}
}
|