..
2024-08-18 15:19:33
发布于:广东
7阅读
0回复
0点赞
#include <iostream>
#include <vector>
using namespace std;
int main() {
    
	int n, m;
	cin >> n >> m;	// n是数量,m 是背包容量
	// w[i] 水晶重量,v[i] 是水晶价值
	vector<int>w(n + 1), v(n + 1);
	for (int i = 1; i <= n; i++) {
		cin >> w[i];
	}
	for (int i = 1; i <= n; i++) {
		cin >> v[i];
	}
	// dp[i][j] 处理第 i 个水晶,背包容量是 j 的时候,能够获得的最大价值
	vector<vector<int>>dp(n + 1, vector<int>(m + 1, 0));
    
	// 对于每个水晶进行判断
	for (int i = 1; i <= n; i++) {
		// 第 i 个水晶在 背包容量为 j 的时候,记录最大价值
		for (int j = 0; j <= m; j++) {
			// 此时背包容量是无法装下这个物品,背包在 i-1 的时候 容量为 j 的最大值
			if (w[i] > j)dp[i][j] = dp[i - 1][j];
                
			// 前一个不装入背包,剩余空间在 i-1 的时候,容量为 j - w[i] 的最大值  加自己的价值
			else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i]);
		}
	}
	cout << dp[n][m];	// 处理完 n 件物品,m 最大背包容量是的价值
	return 0;
}
这里空空如也



有帮助,赞一个