动态规划
求解的基本步骤
1)找出最优解的性质,并刻画其结构特征;
2)递归地计算最优值;
3)以自底向上的方式计算出最优值。
与分治法的区别
其得到的子问题是相互独立的。
例子
1、0-1背包问题
问题描述:给定n件物品和一背包。物品i的重量是wi,价值为vi,背包的容量为C。问:应该如何选择装入背包的物品,使得装入背包中物品的总价值最大?(每种物品只有装与不装两种选择,故其为一个特殊的整数规划问题)
java实现
0-1背包我现在还是学一次忘一次,也理解不了QAQ每次都是想dp的数组怎么变啊之类的
参考blog:https://blog.youkuaiyun.com/mu399/article/details/7722810
public class PackageProblem {
public static void main(String[] args){
ArrayList<Item> list = new ArrayList<>(5);
list.add(new Item(4,6));
list.add(new Item(5,4));
list.add(new Item(6,5));
list.add(new Item(2,3));
list.add(new Item(2,6));
System.out.println(new PackageProblem().dp(list,10).toString());
}
private static class Item{
int value;
int weight;
public Item(int weight, int value){
this.value = value;
this.weight = weight;
}
}
public ArrayList<Integer> dp(ArrayList<Item> items, int bagSize){
if(items == null || items.size() == 0 || bagSize <= 0){
return null;
}
int[][] bagArr = new int[items.size()][bagSize+1];
for(int i = 1;i <= bagSize;i++){
for(int j = 0;j < items.size();j++){
Item item = items.get(j);
if(item.weight > i){
if(j == 0){
bagArr[j][i] = 0;
}else {
bagArr[j][i] = bagArr[j-1][i];
}
}else {
if(j == 0){
bagArr[j][i] = item.value;
}else {
int itemInbag = bagArr[j-1][i-item.weight] + item.value;
bagArr[j][i] = bagArr[j-1][i] > itemInbag ? bagArr[j-1][i] : itemInbag;
}
}
}
}
for(int i = 0;i < bagArr.length;i++){
for(int j = 0;j < bagArr[i].length;j++){
System.out.print(bagArr[i][j] + " ");
}
System.out.println();
}
ArrayList<Integer> ans = new ArrayList<>(items.size());
int curSize = bagSize;
for(int i = items.size()-1;i >= 0;i--){
if(curSize <= 0){
break;
}
if(i == 0 && curSize > 0){
ans.add(i);
break;
}
if(bagArr[i][curSize] - bagArr[i-1][curSize-items.get(i).weight] == items.get(i).value){
ans.add(i);
curSize -= items.get(i).weight;
}
}
return ans;
}
}