什么是动态规划
动态规划问世以来,在经济管理、生产调度、工程技术和最优控制等方面得到了广泛的应用。例如最短路线、库存管理、资源分配、设备更新、排序、装载等问题,用动态规划方法比用其它方法求解更为方便
对于动态规划算法的代码实现 —本代码实现01背包
(一定要理解背包的容量是逐渐递增的以及下列公式)
如果当前的物品需要容量>当前容量 v[i][j]=v[i-1][j]; 如果当前的物品需要容量<=当前要容量 Max{v[i-1][j],value[i]+v[i-1][j-w[i]]}
下面是具体案例
-
铅笔 1kg ¥100
-
橡皮 2kg ¥200
-
钢笔 3kg ¥400;
-
一共4kg 求最多能拿多少价值 不能重复拿
public static void main(String[] args) {
int [] w={1,2,3};//物品重量数组
int [] value={100,200,400};//物品价值数组
int m=3;//总物品数
int n=4;//总容量
int [][] v=new int[m+1][n+1];//表示当前能够得到的物品的和当前容量所组成的数组
int [][] path=new int[m+1][n+1];//最后用于表示最大价值所装入的物品
ByZero(v);
toArray(v,w,value,path);
out(v,path,w);
}
public static void ByZero(int [][]v){//将二维数组的第0行和第0列设为为0 就是没有物品或没有空间时价值都为0
for (int i=0;i<v.length;i++){
v[i][0]=0;//将第一列置为0
}
for (int j=0;j<v[0].length;j++){
v[0][j]=0;//将第一行置为0
}
}
//按照规律填充字符串
/*
* 如果当前的物品需要容量>当前容量 v[i][j]=v[i-1][j];
* 如果当前的物品需要容量<=当前要容量 Max{v[i-1][j],value[i]+v[i-1][j-w[i]]}
* */
public static void toArray(int [][]v,int []w,int []value,int [][]path){
for (int i=1;i<v.length;i++){
for (int j=1;j<v[i].length;j++){
if (j<w[i-1]){//因为物品重量数组从0开始
v[i][j]=v[i-1][j];
}else {
if (v[i-1][j]<value[i-1]+v[i-1][j-w[i-1]]){
v[i][j]=value[i-1]+v[i-1][j-w[i-1]];
path[i][j]=1;
}else {
v[i][j]=v[i-1][j];
path[i][j]=0;
}
}
}
}
}
//输出当前最大价值组合的方法(注意是逆向输出否则有多组进入第二个方法)
public static void out(int[][]v,int [][]path,int []w){
int i=v.length-1;
int j=v[0].length-1;
while (i>0&&j>0){
if (path[i][j]==1){
System.out.println("放入第"+i+"个物品");
j-=w[i-1];//求出剩余容量
}
i--;//往上一行求出剩余容量的最大价值
}
}