Advertisement
Guest User

Untitled

a guest
Feb 26th, 2017
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.85 KB | None | 0 0
  1. //#include <vcl.h>
  2. #include<iostream>
  3. #pragma hdrstop
  4.  
  5. //#pragma argsused
  6. //предмет -> контейнер -> упаковка (упаковка - это разные вариации контейнеров и предметов, нам надо найти такую, чтобы там было мин.число контейнеров
  7. const int N=6; // число предметов
  8. float A[N+1]={0,0.1, 0.2, 0.3, 0.7, 0.8, 0.9}, //размеры предметов
  9. V[N]; //заполненность контейнеров
  10. int Box, // кол-во контейнеров в текущей упаковке
  11. OptBox, //кол-во контейнеров в оптимальной упаковке
  12. Cont[N], //текущая упаковка
  13. OptCont[N]; //оптимальная упаковка (ее как раз надо найти)
  14.  
  15. void pack(int i)
  16. { int eps=A[i]*0.1; //некоторое маленькое число (его можно считать = 0)
  17. for (int j=1; j <= N; j++) { //перебираем контейнеры
  18. if (V[j]<=eps && (Box+1)>=OptBox) break; // если контейнер j пуст и кол-во контейнеров в текущей упаковке уже превышает оптимальное кол-во, то выходим
  19. if (j>1&&V[j-1]<=eps) break; //если контейнер не 1 и предыдущий контейнер пустой то выходим
  20. if (V[j]+A[i]<=1+eps) { //если заполненость контейнера + размер предмета меньше 1 (т.е туда можно положить предмет)
  21. int B=Box; //в В записываем кол-во кол-во контейнеров в текущей упаковке
  22. if (V[j]<=eps) Box+=1; // если пустой, то увеличиваем кол-во контейнеров в этой упаковке на 1
  23. V[j]+=A[i]; //заполняем j контейнер на объем i предмета
  24. Cont[i]=j; //предмет i помещаем в j контейнер
  25. if (i<N) pack(i+1); //если текущий предмет не последний, то вызываем рекурсию и пытаемся упаковать след предмет
  26. else //если нет, то
  27. {
  28. OptBox=Box; //в оптим присваиваем текущее кол-во контейнеров в упаковке
  29. for (int k = 1; k <= N; k++) OptCont[k]=Cont[k]; //в оптимальную упаковку = текущую упаковку
  30. }
  31. Box=B; //возвращаем старое старое значение контейнеров в упаковке
  32. Cont[i]=0; //выкидываем текущий предмет
  33. V[j]-=A[i]; //вычитаем объем текущего предмета
  34. }
  35. }
  36. }
  37. int main(int argc, char* argv[])
  38. {
  39. for (int i = 1; i <= N; i++) {
  40. V[i]=0; // все контейнеры очищаем
  41. Cont[i]=0; //все предметы никуда не помещены (лежат в сторонке)
  42. OptCont[i]=i; // оптимальное кол-во контейнеров в упаковке = N (тут чуть неуверен)
  43. }
  44. OptBox=N; //пока оптимально поместить каждый предмет в свой контейнер)
  45. Cont[1]=1; //первый предмет упаковываем в 1 вагон
  46. V[1]=A[1]; // увеличиваем заполненность 1го контейнера на размер 1го предмета
  47. Box=1; //кол-во контейнеров в текущей упаковке =1
  48. pack(2); //упаковываем второй предмет
  49. for (int i = 1; i <= N; i++) std::cout<<OptCont[i]<<" "; //вывод оптимальной упаковки (ответ)
  50. std::cin.get();std::cin.get();
  51. return 0;
  52. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement