01背包:有n件物品,每件物品的重量为w[i],价值为c[i]。现在需要选出若干物品放入一个容量为V的背包中,使得在选入背包的物品重量和不超过容量V的前提下,让背包中物品的价值之和最大,求最大价值。( 1 ≤ n ≤ 20 1 \le n \le 20 1≤n≤20)
动态规划
状态设置:dp[i]
表示体积为i的背包能装的最大价值。
状态转移:dp[j] = max(dp[i], dp[j-Vol[i]] + Val[i]);
#include <bits/stdc++.h>
using namespace std;
int dp[30], n, Val[30], Vol[30], Vol_of_bag;
int main () {
cin >> n >> Vol_of_bag;
for (int i = 0; i < n; i++) {
cin >> Vol[i] >> Val[i];
}
dp[0] = 0;
for (int i = 0; i < n; i++) {
for (int j = Vol_of_bag; j >= Vol[i]; j--) { //逆序,每个只拿一次。
dp[j] = max(dp[j], dp[j - Vol[i]] + Val[i]);
}
}
cout << dp[Vol_of_bag];
}
搜索
使用深度优先搜索:
岔路口:拿还是不拿
死胡同:对n件物品都完成了选择。
#include <bits/stdc++.h>
using namespace std;
int n, Val[30], Vol[30], Vol_of_bag, MaxVal = 0;
void dfs(int index, int sumVol, int sumVal) {
if (index == n) {
return;
}
dfs(index + 1, sumVol, sumVal);
if (sumVol + Vol[index] <= Vol_of_bag) {
if (sumVal + Val[index] > MaxVal) {
MaxVal = sumVal + Val[index];
}
dfs(index + 1, sumVol + Vol[index], sumVal + Val[index]);
}
}
int main () {
cin >> n >> Vol_of_bag;
for (int i = 0; i < n; i++) {
cin >> Vol[i] >> Val[i];
}
dfs(0, 0, 0);
cout << MaxVal;
}