一、动态规划
代表一类问题(最优子结构或子问题最优性)的一般解法,是设计方法或者策略,不是具体算法
本质:递推,核心是找到状态转移的方式,写出dp方程。
解决问题:交叉,重叠子问题(最优子问题)
形式:
记忆型递归
递推
与深搜的区别:深搜要所有符合条件的解,动态规划要求最优解(唯一解)
二、题目
有n个重量和价值分别为wi和vi的物品,从这些物品中挑选出重量不超过w的物品,求所有挑选方案中价值总和的最大值。
1<=n<=100
1<=wi,vi<=100
1<=w<<10000
输入:
n=4
(w,v)={(2,3),(1,2),(3,4),(2,3)}
w=5
输出
7(选择第0,1,3号物品)
分析思路
通常可以用execl分析
根据表格思路写代码
- 代码
package bag01jiyidigui;
public class Bag_dp {
static int[] w= {2,1,3,2}; //重量表
static int[] v= {3,2,4,2}; //价值表
static int n=4; //物品数量
static int W=5; //背包的承重极限
static int max(int a,int b) {
return a;
}
static int dp() {
int[][]dp=new int[n][W+1];
//初始化dp表中的第一行
for(int i=0;i<W+1;i++) {
if(i>=w[0]) { //每种容量-0号物品
dp[0][i]=v[0];
}
else {
dp[0][i]=0;
}
}
//其他行
for(int i=1;i<n;i++) {
//j是列,也是背包的剩余容量
for(int j=0;j<W+1;j++) {
if(j>=w[i]) { //要的起,在承重范围内
int i1=v[i]+dp[i-1][j-w[i]]; //选择当前物品即i号物品,剩余容量
int i2=dp[i-1][j];
dp[i][j]=max(i1,i2);
}
else {
dp[i][j]=dp[i-1][j];
}
}
}
return dp[n-1][W];
}
}