Пример #1
0
int main(int argc, char *argv[])
{
	//If there are not at least 3 arguments, then quit
	//ARG1: Binpack ARG2: binSize ARG3: First items
	if (argc < 3) {
		exit(0);
	}

	//Variables
	int binSize;
	int numItems;
	int items[MAX_SIZE];
	int sorted[MAX_SIZE];
	int solutions[5];

	//Initialize variables
	for (int a = 0; a < MAX_SIZE; a++) {
		items[a] = 0;
	}
	for (int a = 0; a < 5; a++) {
		solutions[a] = -1;
	}
	int Flags[argc-2];
	for (int a = 0; a < argc-2; a++) {
		Flags[a] = 0;
	}

	//Read in the bin size
	binSize = atoi(argv[1]);
	if (binSize <= 0) {
		exit(0);
	}

	//Flag options
	char *FlagOp[5] = {"-opt", "-ff", "-bf", "-ffd", "-bfd"};

	int i;
	numItems = 0;
	//Read in the items
	for (i = 2; i < argc; i++) {
		//If the arg is a flag, leave loop
		if (strcmp(argv[i], FlagOp[0]) == 0 ||
			strcmp(argv[i], FlagOp[1]) == 0 ||
			strcmp(argv[i], FlagOp[2]) == 0 ||
			strcmp(argv[i], FlagOp[3]) == 0 ||
			strcmp(argv[i], FlagOp[4]) == 0) {
			//If no items, then quit
			if (i == 2) {
				exit(0);
			}
			break;
		}
		//If an item is not a positive integer
		//Or is larger than binSize
		//Or if there are more than MAX_SIZE items, quit
		else if (atoi(argv[i]) <= 0 ||
			atoi(argv[i]) > binSize ||
			numItems == MAX_SIZE) {
			exit(0);
		}
		else {
			items[i-2] = atoi(argv[i]);
			numItems++;
		}
	}

	//Read in the Flags
	for (int f = 0; i < argc; f++) {
		if (strcmp(argv[i], FlagOp[0]) == 0) Flags[f] = 1;
		else if (strcmp(argv[i], FlagOp[1]) == 0) Flags[f] = 2;
		else if (strcmp(argv[i], FlagOp[2]) == 0) Flags[f] = 3;
		else if (strcmp(argv[i], FlagOp[3]) == 0) Flags[f] = 4;
		else if (strcmp(argv[i], FlagOp[4]) == 0) Flags[f] = 5;
		else {
			exit(0);
		}
		i++;
	}

	//Make a copy of items and sort
	for (int a = 0; a < MAX_SIZE; a++) {
		sorted[a] = items[a];
	}
	sortDecreasing(sorted);

	//Binpacking loop
	for (int b = 0; Flags[b] != 0; b++) {

		//Initialize Empty bins
		int bins[numItems];
		for (int a = 0; a < numItems; a++) {
			bins[a] = 0;
		}

		//Backtracking
		if (Flags[b] == 1) {
			if (solutions[0] == -1) {

				//Compute sum of item sizes
				int sumItems = 0;
				for (int p = 0; sorted[p] != 0 && p < MAX_SIZE; p++) {
					sumItems += sorted[p];
				}

				//Heuristic B
				int lowerBound = lowBound(sumItems, binSize);

				//Heuristic C
				int minBins = MAX_SIZE;

				//Recursion
				minBins = backtrack(0, binSize, numItems, bins, sorted,
					lowerBound, minBins, 0, 0, 0);

				solutions[0] = minBins;
			}
			printf("-opt %d\n", solutions[0]);

		}

		//First Fit
		else if (Flags[b] == 2) {
			if (solutions[1] == -1) {
				solutions[1] = firstFit(binSize, numItems, bins, items);
			}
			printf("-ff  %d\n", solutions[1]);
		}

		//Best Fit
		else if (Flags[b] == 3) {
			if (solutions[2] == -1) {
				solutions[2] = bestFit(binSize, numItems, bins, items);
			}
			printf("-bf  %d\n", solutions[2]);			
		}

		//First Fit Decreasing
		else if (Flags[b] == 4) {
			if (solutions[3] == -1) {
				solutions[3] = firstFit(binSize, numItems, bins, sorted);
			}
			printf("-ffd %d\n", solutions[3]);
		}

		//Best Fit Decreasing
		else if (Flags[b] == 5) {
			if (solutions[4] == -1) {
				solutions[4] = bestFit(binSize, numItems, bins, sorted);
			}
			printf("-bfd %d\n", solutions[4]);	
		}
	}
}
 vector<int> searchRange(vector<int>& nums, int target) {
     return {lowBound(nums, target), upBound(nums, target)};
 }