📄 firstfit.cpp
字号:
// First fit bin packing#include <iostream.h>#include "winner.h"int winner(int a[], int b, int c){// For a max winner tree. if (a[b] >= a[c]) return b; return c;}void FirstFitPack(int s[], int n, int c){// Output first fit packing into bins of size c. // n is the number of objects and s[] their size. WinnerTree<int> *W = new WinnerTree<int> (n); int *avail = new int [n+1]; // bins // initialize n bins and winner tree for (int i = 1; i <= n; i++) avail[i] = c; // initial available capacity W->Initialize(avail, n, winner); // put objects in bins for (int i = 1; i <= n; i++) {// put s[i] in a bin // find first bin with enough capacity int p = 2; // start search at left child of root while (p < n) { int winp = W->Winner(p); if (avail[winp] < s[i]) // first bin is in p++ ; // right subtree p *= 2; // move to left child } int b; // will be set to bin to use p /= 2; // undo last left child move if (p < n) {// at a tree node b = W->Winner(p); // if b is right child, need to check // bin b-1. No harm done by checking // bin b-1 even if b is left child. if (b > 1 && avail[b-1] >= s[i]) b--;} else // arises when n is odd b = W->Winner(p/2); cout << "Pack object " << i << " in bin " << b << endl; avail[b] -= s[i]; // update avail. capacity W->RePlay(b, winner); }}void main(void){ int n, c; // number of objects and bin capacity cout << "Enter number of objects and bin capacity" << endl; cin >> n >> c; if (n < 2) {cout << "Too few objects" << endl; exit(1);} int *s = new int[n+1]; for (int i = 1; i <= n; i++) { cout << "Enter space requirement of object " << i << endl; cin >> s[i]; if (s[i] > c) { cout << "Object too large to fit in a bin" << endl; exit(1);} } FirstFitPack(s, n, c);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -