Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <math.h>
- #define N 7
- float x[] = {
- 11.5,
- 12,
- 12,
- 12.5,
- 13,
- 13,
- 14.5
- };
- char vis[N] = {0};
- float temp[N];
- int steps[N];
- float sol[N];
- int solsteps[N];
- float sum = 0;
- float min = 0;
- int f = 0;
- int mal = 0;
- float roundar(float param) {
- float fractpart;
- double intpart;
- fractpart = modf (param , &intpart);
- if (fractpart >= 0.75) fractpart = 0.75;
- else if (fractpart >= 0.5 ) fractpart = 0.5 ;
- else if (fractpart >= 0.25) fractpart = 0.25;
- else fractpart = 0;
- return param; // optionality...
- }
- void rec(int level, float cobon, float stack) {
- int i;
- if (level == N) {
- if ((!f) || (sum < min)) {
- f = 1;
- min = sum;
- for (i = 0; i < N; i++) sol[i] = temp[i], solsteps[i] = steps[i];
- }
- return;
- }
- for (i = 0; i < N; i++) {
- if (!vis[i]) {
- vis[i] = 1;
- float cost ;
- temp[level] = x[i];
- // there are two possiblities...
- // 1- terminate the stack:
- cost = roundar((1-cobon) * (stack + x[i]));
- sum += cost;
- steps[level] = mal++;
- rec(level+1, (roundar(0.5*cost))/100, 0);
- mal--;
- sum -= cost;
- // 2- don't terminate it:
- if (level != N - 1) {
- rec(level+1, cobon, stack + x[i]);
- }
- vis[i] = 0;
- }
- }
- }
- int main() {
- int i = 0;
- rec(0, 0, 0);
- printf("min=%f\n", min);
- for (i = 0; i < N; i++)
- printf("%.2f (%d)%s", sol[i], solsteps[i], i==N-1 ? "\n":" => ");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement