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

读者可自行设置答案,检查输出是否正确。

谢谢阅读。

参考《算法笔记》

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