DFS: 揹包問題(C++實現)

問題描述:有n件物品,每件物品的重量爲w[i],價值爲c[i]。現在需要選出若干件物品放入一個容量爲V的揹包中,使得在選入揹包的物品重量在不超過容量V的前提下,讓揹包中物品的價值之和最大,求最大價值。(1≤n≤20)

解題思路:深度優先遍歷 + 遞歸實現,對於每一個物品都存在選和不選兩種情況,每種情況下,更新最大價值,直到遍歷完所有的物品。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
using namespace std;

int n; // 物品件數
int V; // 揹包容量
int maxValue = 0; // 最大價值
vector<int> w(20); // w[i]:每件物品的重量
vector<int> c(20); // c[i]:每件物品的價值

void DFS(int index, int sumW, int sumC)
{
	// 已經完成對n件物品的選擇
	if (index == n) return;
		
	// 不選第index件物品
	DFS(index + 1, sumW, sumC);

	// 只有加入第index件物品後未超過容量V,才能繼續
	if (sumW + w[index] <= V)
	{
		// 更新最大容量
		sumC + c[index] > maxValue ? maxValue = sumC + c[index] : 0;
		
		// 選擇第index件物品
		DFS(index + 1, sumW + w[index], sumC + c[index]);
	}
}

int main()
{
	// 物品個數及揹包容量
	scanf("%d%d", &n, &V);

	// 讀入每件物品的重量
	for (int i = 0; i < n; ++i)
		scanf("%d", &w[i]); 

	// 讀入每件物品的價值
	for (int i = 0; i < n; ++i)
		scanf("%d", &c[i]); 

	// 初始時爲第0件物品、當前總重量和總價值均爲0
	DFS(0, 0, 0); 

	printf("%d", maxValue);
	
	return 0;
}

輸入舉例:

4 20
10 5 4 7
40 20 20 5

輸出:

80

讀者可自行設置答案,檢查輸出是否正確。

謝謝閱讀。

參考《算法筆記》

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