package DP;
import java.util.ArrayList;
import java.util.List;
public class Bag {
static class Item{
int w;//weight
int v;//values
public Item(int w, int v) {
this.w = w;
this.v = v;
}
}
static List<Item> BagList=new ArrayList<>();
static int W=16;//背包最大重量为16
public static void main(String[] args) {
//initial
BagList.add(new Item(10,100));
BagList.add(new Item(7,63));
BagList.add(new Item(8,56));
BagList.add(new Item(4,12));
//
int nItemsSize=BagList.size();
int[][] f=new int[nItemsSize+1][W+1];//f(k,w)
//初始化
for(int i=0;i<=nItemsSize;i++){
f[i][0]=0;
}
for(int w=0;w<=W;w++){
f[0][w]=0;
}
for(int i=1;i<=nItemsSize;i++){//取前i个BagList.get(i)
Item item=BagList.get(i-1);
for(int w=1;w<=W;w++){//
if(item.w>w) f[i][w]=f[i-1][w];//无法取得
else{
f[i][w]=Math.max(f[i-1][w-item.w]+item.v,f[i-1][w]);// 取 或 不取
}
}
}
System.out.println("MAX_VALUE:"+f[nItemsSize][W]);
}
}
package DP;
import java.util.ArrayList;
import java.util.List;
public class BagBacktrack {
static class Item{
int w;//weight
int v;//values
public Item(int w, int v) {
this.w = w;
this.v = v;
}
}
static List<Bag.Item> BagList=new ArrayList<>();
static int W=16;//背包最大重量为16
static int MAX_VALUE=0;
public static void main(String[] args) {
//initial
BagList.add(new Bag.Item(10,100));
BagList.add(new Bag.Item(7,63));
BagList.add(new Bag.Item(8,56));
BagList.add(new Bag.Item(4,12));
//
//初始容量 16
DFS(0,16,0);
System.out.println("MAX_VALUE:"+MAX_VALUE);
}
public static void DFS( int index, int W, int tempMax){//index 当前到达哪一个位置的物品 物品从下标0开始 W剩余背包容量
if(index==BagList.size() || W==0){
MAX_VALUE=Math.max(MAX_VALUE,tempMax);
return;
}
Bag.Item item=BagList.get(index);
if(item.w>W){
DFS(index+1,W,tempMax);
}else{
//取
DFS(index+1,W-item.w,tempMax+item.v);
//不取
DFS(index+1,W,tempMax);
}
}
}
....
分支界定:
package DP;
import java.util.*;
public class BagBranchDefinition {
static class Item{
int w;//weight
int v;//values
double v_w;
public Item(int w, int v) {
this.w = w;
this.v = v;
v_w=(double) v/w;
}
@Override
public String toString() {
return " Weight: "+w+" value: "+v+" 价值重量比: "+v_w;
}
}
static List<Item> BagList=new ArrayList<>();
static int W=16;//背包最大重量为16
public static void main(String[] args) {
//initial
BagList.add(new Item(10, 100));
BagList.add(new Item(7, 63));
BagList.add(new Item(8, 56));
BagList.add(new Item(4, 12));
//sort 按照价值重量比实现降序排序
Collections.sort(BagList, new Comparator<Item>() {
@Override
public int compare(Item o1, Item o2) {
double v_w_1=o1.v_w;
double v_w_2=o2.v_w;
if(v_w_1>v_w_2){
return -1;
}
if(v_w_1<v_w_2){
return 1;
}
return 0;
}
});
// for (Item item : BagList) {
// System.out.println(item);
// }
DFSBranch(0,0,0,UB(0,0,0));
System.out.println(TEMP_UB);
System.out.println(ANS);
//分支界定法
}
static int TEMP_UB=Integer.MIN_VALUE;
static int ANS=0;
//index 当前到达哪一个位置的物品 物品从下标0开始 tempW 当前重量 tempV当前价值 tempUB当前上界值
public static void DFSBranch( int index, int tempW, int tempV,int tempUB){
System.out.println(index+" "+ tempW +" "+tempV+" "+tempUB);
if(index==BagList.size()){//探索到最后 找到一个叶子节点
TEMP_UB= Math.max(TEMP_UB,tempUB);
//到最后 tempV=tempUB
ANS= Math.max(ANS,tempV);
return;
}
//如果装了就爆炸
//还没有结束
if(tempUB<=TEMP_UB){
return;
}
Item item=BagList.get(index);
if(tempW+item.w>W){
//不取
DFSBranch(index+1,tempW,tempV,UB(index+1,tempW,tempV));
}else{
//取
DFSBranch(index+1,tempW+item.w,tempV+item.v,UB(index+1,tempW+item.w,tempV+item.v));
//不取
DFSBranch(index+1,tempW,tempV,UB(index+1,tempW,tempV));
}
}
public static int UB(int index,int tempW,int tempV){
// System.out.println("UB:" +index+" "+ tempW+" "+tempV);
//vi+ (W-wi)*(v_wi+1)
double v_w_perfect=0;
if(index<BagList.size()){
v_w_perfect=BagList.get(index).v_w;
}
int ub= (int) (tempV+(W-tempW)* v_w_perfect);
return ub;
}
}
减枝: