基础算法学习总结,后续会不断增加。
编译时请使用–std=c++11选择项,如:vector数组使用了c++11的初始化列表特性。
1.01背包问题
容量为12的背包,有6种物品,每种物品只有一个,其重量分别为4, 6, 2, 2, 5, 1,其价值分别为8, 10, 6, 3, 7, 2。
设计算法,实现背包内物品价值最大。
#include <iostream>
#include <vector>
int max(int left, int right) {
return left > right ? left : right;
}
int ZeroOneBag(const std::vector<int>& wights, const std::vector<int>& values, int bagspace) {
// 容量为bagspace的背包想放入第i件物品,有两种情况:
// (1)放入第i件物品
// left = totalvalue[i - 1][bagspace - wights[i]] + values[i]
// (2)不放第i件物品
// right = totalvalue[i - 1][bagspace]
//
// 容量为bagspace的背包在挑选完i件物品后的总价值:
// totalvalue[i][bagspace] = max{left, right}
std::vector<std::vector<int>> totalvalue;
totalvalue.resize(2);
for (int i = 0; i < totalvalue.size(); ++i) {
totalvalue[i].resize(bagspace + 1, 0);
}
for (int i = 1; i < wights.size(); ++i) {
for (int j = wights[i]; j <= bagspace; ++j) {
totalvalue[i % 2][j] = max(totalvalue[(i - 1) % 2][j], totalvalue[(i - 1) % 2][j - wights[i]] + values[i]);
}
}
return totalvalue[(wights.size() - 1) % 2][bagspace];
}
int main() {
std::vector<int> values = {
0, 8, 10,