問題描述:有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
讀者可自行設置答案,檢查輸出是否正確。
謝謝閱讀。
參考《算法筆記》