动态规划

image-20240805162519768

这道题是一个典型的01背包问题,只是在处理的时候遇到了递增和递减的问题,最开始很不理解的原因是我对dp的二维数组填充过程以及依赖关系没有明确清晰的认知,再加上在对找零钱这道题目中有递增操作的影响下,一直没能顺利写出正确的过程来。长话短说,这里主要涉及到一个本回合要选择的价值内容对上一轮次的占用问题。

请看如下期望的递增模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
vector<int> f(target + 1, INT_MIN);
f[0] = 0;
int s = 0;
for (int x : nums) {
for (int j = 1; j <= target; j++) {
if (j >= x)
{
if (f[j - x] != INT_MIN)
{
f[j] = max(f[j], f[j - x] + 1); //
}
}
cout << f[j]<<" , ";
}
cout << endl;
}
return f[target] > 0 ? f[target] : -1;

image-20240805162926074

在需求的第二行中就出现了 嵌套循环第二层中引用了被之前修改的数据,主要出现在 动态规划朝着 一维滚动数据的优化 的过程中出现的,

再来看所谓的零钱兑换,它并不在乎在本次引用了本次修改的数据,因为一个位置可以重复使用这个特性的存在,使得重复引用变得是重复使用这个索引上的零钱数量。

image-20240805163455560

具体细则

空间优化中的注意事项

image-20240805195501745

递推中的注意事项

image-20240805195825737

同时注意在memo容器中对于初始化值的设定,建议在设定为0