0-1背包
有一个容量为 N 的背包,要用这个背包装下物品的价值最大,这些物品有两个属性:体积 w 和价值 v。每件物品仅使用一次。
主要特点:每个物品只有一件,选择放或者不放。
f(i,v)表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:f(i,v)=max{f(i-1,v),f(i-1,v-c[i])+w[i]}。
放第i件物品:f(i,v) = 第i件物品的价值+i-1件物品放入v-第i件物品的花费
不放第i件物品:就是前i-1件物品放入容量为v的背包中。
416. 分割等和子集
给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
完全背包
每件物品使用次数不限制。
多重背包
每个物品可选的次数不同。
汉诺塔
1 | /** |
198.打家劫舍
1 | //dp[i]到第i家可以偷多少钱dp[i]=max(dp[i-1],dp[i-2]+nums[i-1]) |
打印字符串子序列
例如abc,打印a , ab , abc ,ac, bc,以及空字符串
1 | public void printAllSub(char[] arr,int i,String res){ |
生牛

64. 最小路径和
暴力递归解法
1 | public int minPathSum(int[][] grid) { |
实际上,暴力递归有许多计算是重复的,这样造成时间复杂度过高,暴力嘀咕可以转化为动态规划。
1 | public int minPathSum(int[][] grid) { |
使用一维数组
1 | public int minPathSum(int[][] grid) { |
任意个数字相加等于aim?

1 | /**第一种是递归方法来解决。每个元素有选择以及不选择两种可能 |
53. 最大子序和
1 |
|
120. 三角形最小路径和
1 | /** |
换钱方法数

递归版本
1 | /** |
动态规划版本:
1 | /** |
486.纸牌博弈问题
1 | /** |
机器人达到指定位置
1 | /** |