背包问题

01背包

相关题目

int package01(const vector<vector<int>>& things,const int volume,const int n) {
	vector<vector<int>> dp(n + 1, vector<int>(volume + 1, 0));
	// dp[i][j]表示前i件物品体积不超过j的情况下的最大价值
	for (int i = 1; i <= n; i++) {
		int weight = things[i - 1][0], value = things[i - 1][1];
		for (int j = 1; j <= volume; j++) {
			// 如果足够放下,就比较放和不放哪个大
			// 如果放了,就看当前价值加上剩下容量可以容纳的最大价值
			if (j >= weight) dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight] + value);
			else dp[i][j] = dp[i - 1][j];
		}
	}

	/*for (vector<int> nums : dp) {
		for (int num : nums) cout << num << " ";
		cout << endl;
	}*/
		
	return dp[n][volume];			
}

int main() {
	int n, volume;
	cin >> n >> volume;

	vector<vector<int>> things(n, vector<int>(2));
	for (int i = 0; i < n; i++)
		cin >> things[i][0] >> things[i][1];

	cout<<package01(things, volume, n);

	return 0;
}

空间优化为一维数组

int package01(const vector<vector<int>>& things,const int volume,const int n) {
	
	vector<int> dp(volume, 0);

	for (int i = 1; i <= n; i++)
		for (int j = volume; j >= things[i - 1][0]; j--)
			dp[j] = max(dp[j], dp[j - things[i - 1][0]] + things[i - 1][1]);
	return dp[volume];
}

虽然还不是很理解,但知道了大概怎么用

完全背包

很神奇的是,就结果而言,完全背包压缩后的代码只需要把01背包压缩后的代码的内层遍历由反向改为正向即可

posted @ 2022-10-09 10:10  YaosGHC  阅读(19)  评论(0)    收藏  举报