问题描述:有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
读者可自行设置答案,检查输出是否正确。
谢谢阅读。
参考《算法笔记》