背包问题

背包问题

参考:

动态规划解决01背包问题

三种基本背包问题

示例:

背包问题详解:01背包、完全背包、多重背包

三种背包问题(01背包、完全背包、多重背包)

01背包

有n 个物品,它们有各自的重量和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?

二维数组:

伪代码:

示例代码:

#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;

int max_value(int C, const vector<int> &W, const vector<int> &V) {
	vector<int> dp(C + 1, 0);

	for (int i = 0; i < W.size(); i++)
		for (int j = C; j >= W[i]; j--)
			dp[j] = max(dp[j], dp[j - W[i]] + V[i]);

	return dp[C];
}

int main() {
	/* test1 */
	//int C = 8;  // capacity, max_value=10
	//vector<int> W{ 2,3,4,5 };  // weight
	//vector<int> V{ 3,4,5,6 };  // value

	/* test2 */
	//int C = 10;  // capacity, max_value=13
	//vector<int> W{ 2,3,5,5 };  // weight
	//vector<int> V{ 2,4,3,7 };  // value

	/* test3 */
	int C = 11;  // capacity, max_value=40
	vector<int> W{ 1,2,5,6,7 };  // weight
	vector<int> V{ 1,6,18,22,28 };  // value

	int m = max_value(C, W, V);
	cout << "max_value: " << m << endl;
}

多重背包

示例代码:

#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;

int max_value(int C, const vector<int> &W, const vector<int> &V, const vector<int> &N) {
	vector<int> dp(C + 1, 0);

	for (int i = 0; i < W.size(); i++)
		for (int j = C; j >= W[i]; j--)
			for (int k = 1; k <= N[i]; k++)
				if (j >= k*W[i])
					dp[j] = max(dp[j], dp[j - k*W[i]] + k*V[i]);

	return dp[C];
}

int main() {
	/* test1 */
	int C = 10;  // capacity, max_value=13
	vector<int> W{ 10,3,4,5 };  // weight
	vector<int> V{ 3,4,6,7 };  // value
	vector<int> N{ 5,1,2,1 };  // number

	/* test2 */
	//int C = 8;  // capacity, max_value=64
	//vector<int> W{ 2,2,1 };  // weight
	//vector<int> V{ 20,10,6 };  // value
	//vector<int> N{ 2,5,10 };  // number


	int m = max_value(C, W, V, N);
	cout << "max_value: " << m << endl;
}

完全背包

#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;

int max_value(int C, const vector<int> &W, const vector<int> &V) {
	vector<int> dp(C + 1, 0);

	for (int i = 0; i < W.size(); i++)
		for (int j = W[i]; j <= C; j++)
				dp[j] = max(dp[j], dp[j - W[i]] + V[i]);

	return dp[C];
}

int main() {
	/* test1 */
	//int C = 10;  // capacity, max_value=12
	//vector<int> W{ 7,4,3,2 };  // weight
	//vector<int> V{ 9,5,3,1 };  // value

	/* test2 */
	int C = 10;  // capacity, max_value=14
	vector<int> W{ 10,3,4,5 };  // weight
	vector<int> V{ 3,4,6,7 };  // value


	int m = max_value(C, W, V);
	cout << "max_value: " << m << endl;
}
原文地址:https://www.cnblogs.com/jmliao/p/12629587.html