POJ--1017 裝箱問題(貪心)

地址:POJ1017

大意是隻有6*6規格的箱子來裝(雖然是描述三維的,但因爲高度相同,因此忽略掉),給你若干個從1*1到6*6規格的箱子,求所需最小箱子數。

 

思路:很明顯應該利用貪心,即優先從最大規格的箱子數來考慮,然後因爲在裝完較大規格的箱子後,該箱子可以存在剩餘空間,所以仍應該利用,且仍舊優先裝較小規格中較大的箱子。6規格的箱子只能裝一個且空間全佔滿,無剩餘;5規格的箱子裝一個,且還可以裝25個1*1規格的箱子;4*4的裝一個後可以最多裝從5個2*2規格到20個1*1規格的箱子。

關於3*3規格箱子的處理,一個箱子可以裝4到1個該規格箱子,但剩下的空間應該我們分情況討論。在紙上畫一下可得知當該箱子分別裝4,3,2,1個3*3規格後,剩餘空間最多可以裝0,1,3,5個2*2規格的箱子。

剩下的2*2和1*1箱子就首先放進前面各較大規格箱子空間的剩餘,不過的話在用新箱子。

代碼如下:

 

#include<iostream>
using namespace std;


int main() {
	int a, b, c, d, e, f, x, y;//x,y分別爲給規格1,2的箱子剩餘的空間
	int sum;//所需的箱子數量

	while (true) {
		cin >> a >> b >> c >> d >> e >> f;
		if (a + b + c + d + e + f == 0) {
			break;
		}

		sum = f + d + e + (c + 3) / 4;

		y = d * 5;//因爲裝規格爲5的箱子還能最多裝5個規格爲2的箱子

		//判斷規格爲3的箱子數
		if (c % 4 == 3) {
			y += 1;
		}
		else if (c % 4 == 2) {
			y += 3;
		}
		else if (c % 4 == 1) {
			y += 5;
		}

		//如果1*1和2*2的仍沒有裝完
		if (y < b) {
			sum += ((b - y) + 8) / 9;
		}

		x = 36 * sum - 36 * f - 25 * e - 16 * d - 9 * c - 4 * b;
		if (x < a) {
			sum += ((a - x) + 35) / 36;
		}

		cout << sum << endl;
	}

	return 0;
}

另外這道題因爲需要將箱子都裝進,所以在計算數量是要上取整,因此我們可以用比如當x/y時,將原式變爲(x+y-1)/y即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章