1.dp[j]含义:容量为j的背包,有一些可重复放入的物品,放满这个背包的最大价值
完全背包中每个物品可以使用无数次:遍历背包时采用正序遍历
(对于纯完全背包问题)先遍历物品还是先遍历背包无所谓:只要这个值是在前面曾经推导出来的数值的基础上进行推到的话,都不影响得到一个正确的结果
2.递推公式:
dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
3.遍历顺序:
先遍历物品还是先遍历背包都可以。
遍历背包时必须从前往后。
其实这两点,再加上背包的特性,是紧密相关的。正因为可以重复选取,所以必须从前之后(这一点与01背包的每个物品只选一次的特点,所以必须从后之前相对应),因为是从前之后,所以先背包和先物品都可以。
4.初始化:都为0
5.打印dp
题目:518.零钱兑换||
求组合数:
class Solution {
public:int change(int amount, vector<int>& coins) {vector<int> dp(amount + 1, 0);dp[0] = 1;for(int i = 0; i < coins.size(); i++){for(int j = coins[i]; j <= amount; j++){dp[j] += dp[j - coins[i]];}}return dp[amount];}
};