算法分析 0-1背包动态规划 / DFS /分支界定

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]);
    }
}

830c35468a8249f481dd384e5aa39252.png

 

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);
        }

    }

}

474b20d634144157982f5729a2933ac8.png

 ....

分支界定:

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;
    }




}

db395dd276be45e4a6bf88b3c1922648.png

减枝: 

 961a139004bd4885b39a021dcbe238fc.png

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值