动态规划:将大问题划分为小问题进行求解,从而一步步获取最优解的算法。
先求子问题,然后从这些子问题的解得到原问题的解。
具体的用途:分解的子问题往往不是独立的,下一个子阶段的求解是建立在上一个子阶段的解的基础上进行进一步的求解。
就相当于填表的方式逐步推进,得到最优解。
package dynamicGuiHua;
import java.util.Arrays;
/**
* 2020/8/8
* 18:36
*/
public class DynamicProgramming {
public static void main(String[] args) {
int[] price={1500,3000,2000};
int[] weight={1,4,3};
int capacity=4;
dynamic(price, weight, capacity);
}
public static void dynamic(int[] price,int[] weight,int capacity){
//物品的个数
int priceNum=price.length;
//存放总的价格
int[][] v= new int[priceNum+1][capacity+1];
//记录存放的物品
int[][] path=new int[priceNum+1][capacity+1];
//容量为零,价格就为零
for (int i = 0; i < v.length; i++) {
v[i][0]=0;
}
//物品为0,价格就为零
for (int i = 0; i < v[0].length; i++) {
v[0][i]=0;
}
for(int i=1;i<v.length;i++){
for(int j =1; j<v[0].length;j++){
//物品重量大于容量
if(weight[i-1]>j){
v[i][j]=v[i-1][j];
}else{
if(v[i-1][j]<v[i-1][j-weight[i-1]]+price[i-1]){
path[i][j]=1;
v[i][j]=v[i-1][j-weight[i-1]]+price[i-1];
}else{
v[i][j]=v[i-1][j];
}
//物品重量小于容量,物品的大小加上剩余容量的价格和前i-1个物品总的价格比较
//v[i][j]=Math.max(v[i-1][j],v[i-1][j-weight[i-1]]+price[i-1]);
}
}
}
//循环遍历
for (int[] ints : v) {
System.out.println(Arrays.toString(ints));
}
//输出存放的物品
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=j-weight[i-1];
}
i--;
}
}
}
//答案
[0, 0, 0, 0, 0]
[0, 1500, 1500, 1500, 1500]
[0, 1500, 1500, 1500, 3000]
[0, 1500, 1500, 2000, 3500]
存放的物品是3号
存放的物品是1号