本题是求:一共有多少种方法可以将背包装满 ( 与目标和 那道递推公式类似
1. dp [ j ] 数组的含义
下标:当前总和
值:凑到当前和有多少种方法
2.递推公式
dp [ j ] = dp [ j ] + dp [ j - conis[ i ] ]
不取 i : dp [ j ]
取 i : dp [ j - conis[ i ] ] 也就是凑到剩余 j - conis[ i ],需要的方案
3.初始化
dp [ 0 ] = 1,如果初始化成 0 , 那之后都是 0 , 无法递推累加了
4. 遍历
先物品后背包
这里先物品后背包,是为了防止出现{ 1 , 2 } { 2 , 1 } 这种情况
因为物品一定是按照次序一个个放入背包中的
且背包需要正序遍历,因为物品是可以重复取的,且不受上一层得影响
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] + dp[j - coins[i]];
}
return dp[amount];
}
};