解题思路:

设dp[i][j]的含义是:在背包承重为j的前提下,从前i种物品中选能够得到的最大价值。
如何计算dp[i][j]呢?我们可以将它划分为以下若干部分:
选0个第i种物品:相当于不选第i种物品,对应dp[i-1][j];
选一个第i种物品:对应dp[i - 1][j - v[i]] + w[i];
选两个第i种物品:对应dp[i - 1][j - 2 * v[i]] + 2 * w[i];
.....
上述过程并不会无限进行下去,因为背包的承重是有限的。设第i种物品最多可以选t个,则t = ⌊j / v[i]⌋,
于是得到递推式dp[i][j] = max(0 <= k <= t)(dp[i - 1][j - k * v[i]] + k * w[i];
参考文献:https://blog.csdn.net/raelum/article/details/128996521作者:Lareges


注意事项:

参考代码:

#includeusing namespace std;

const int N = 1008;

int v[N], w[N];//v[i]表示第i个物品的价值,w[i]表示第i个物品的重量;
int dp[N][N]; // 创建dp数组;

int main()
{
	int n, m; // 物品数量、背包最大承重;
	cin >> m >> n;
	for (int i = 1; i >w[i] >> v[i];

	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
		{
			int t = j / w[i]; // t为第i种物品最多能携带的数量;
			for (int k = 0; k <= t; k++)
				dp[i][j] = max(dp[i-1][j], dp[i - 1][j - k * w[i]] + k * v[i]);
		}
	}
	cout << "max=" << dp[n][m] << "\n";
	return 0;
}


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论