Hướng dẫn bài CALFTEST - Thi Nghé

Trùm CUỐI 2020-04-13 7:38:43 2021-03-10 10:14:25

Đây là bài toán thuộc dạng bài cái túi:

Cho n thỏi vàng, thỏi thứ i có giá trị v_i và trọng lượng w_i . Có một cái túi đựng được tối đa trọng lượng W . Hãy tìm cách chọn các thỏi vàng cho vào túi sao cho trổng trọng lượng không vượt quá giới hạn của túi và tổng giá trị lớn nhất.

Thuật toán duyệt quay lui:

Mỗi phương án chọn các thỏi vàng có dạng một vec-tơ (x_1,x_2,…,x_n ) trong đó:

  • x_i∈\{0,1\} ( 0 : không chọn thỏi vàng thứ i , 1 : có chọn)
  • x_1×w_1+x_2×w_2+⋯+x_n×w_n≤W Ta cần tìm một nghiệm sao cho x_1×v_1+x_2×v_2+⋯+x_n×v_n lớn nhất.

Thủ tục Backtracking:

void BT(int i, int sW, int sV) {
	+ Nếu i > n:
	Cập nhật phương án tốt nhất
	Thoát
	//Không chọn thỏi vàng thứ i
	BT(i + 1, sW, sV)
	//Nếu có thể chọn thỏi vàng thứ i thì thử chọn
	if (w[i] + sW <= W)
		BT(i + 1, sW + w[i], sV + v[i])
}