33,017
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#define IN
#define OUT
#define INOUT
int max = 10;
float in[10] = {1.1f,1.2f,1.3f,2.0f,3.2f,4.8f,9.0f,11.2f,18.0f,20.0f};
enum dState{INIT = 0, STACK};
int state[10] = {0};
float m = 28.3f;
float g_sum = 0.0f;
//float diff[10] = {0}; // 差值数组
//float d_min = 0.0f; // 最小误差
int stack[10 + 1] = {0};
int ps = 0;
void push(IN int index)
{
if( index>0 )
printf( "push:%f\n", in[index] );
ps++;
stack[ps] = index;
}
int pop()
{
int n = stack[ps--];
if(ps<0) ps = 0;
printf( "pop:%f\n", in[n] );
return n;
}
void init()
{
push(-1);
// diff[0] = m;
// for(int i= 1;i< max;i++)
// {
// diff[i] = in[i]-in[i-1];
// }
}
float getMin(IN float value, OUT int* index)
{
float tm = 0.0f;
*index = -1;
for(int i= 0;i< max;i++)
{
if(state[i] != INIT)
{
continue;
}
if( tm<in[i] && in[i]<value )
{
tm = in[i];
*index = i;
}
}
return tm;
}
int work()
{
float sum = 0.0f;
float di = 0.0f;
// a.选出最接近差值的数据
int index = -1;
float min = getMin(m, &index);
if( index< 0 ) return 0;
while(true)
{
di = m-(min+sum);
if( di< 0.1 ) // 越界
{
min = getMin(in[index], &index);
if( index <0 )
{
index = pop();
sum -= in[index];
state[index] = INIT;
}
}
else if( min< 0.1 ) // 查找空
{
index = pop();
if( index< 0 ) break;
sum -= in[index];
state[index] = INIT;
min = getMin(in[index], &index);
}
else
{
push(index);
state[index] = STACK;
sum += min;
g_sum = (sum>g_sum && m>=sum)?sum:g_sum;
printf( "di:%0.2f, min:%0.2f, sum:%0.2f, g_sum=%0.2f.\n", di, min, sum, g_sum );
min = getMin(min, &index);
}
}
return 2;
}
int main()
{
int ret = -1;
init();
ret = work();
printf("done! ret:%d, sum:%0.2f.\n", ret, g_sum );
getchar();
return 0;
}