求解背包问题: 首先理清是0-1背包还是完全背包,确定for循环,然后写状态方程
完全背包
518 零钱兑换II
377 组合总和
139单词拆分
322零钱兑换
这三种属于完全背包问题。
对于377这种,属于有序放入,要求背包在外循环,物品在内循环,dp[i]+=dp[i-num];
如果不是有序放入,物品作为外循环,背包采用正序的方式进行内循环。
完全背包
对于322,每个零钱都可以使用,而且是无序,求解的是最少零钱数。
对于518 ,每种零钱都可以使用,而且是无序。组合成target的不同组合。
对于377,每个数字都可以使用,但是是有序的。求解的是等于目标和的次数
对于139,每个字符串都可以使用,而且无序,求解是否拼接成目标target
0-1背包
0-1背包:一般以物品作为外循环,背包采用逆序的方式进行内循环。状态方程一般是dp[i]+=dp[i-num] (求目标和),dp[i]=dp[i]||dp[i-num] (求是否存在) 、 dp[i][j]=Math.max(dp[i][j],dp[i-zeros][j-ones]+1);(求解最大集合数)
494 目标和
474一和零
416分割等和子集
对于494,数字只能使用一次,并且无序。求解的是等于目标和的次数
对于474,每个字符串只能使用一次,并且无序,求解的是拼接成目标target的最大集合
对于416,每个数字只能使用一次,无序,求解集合中的累加和是否等于某个target。