0/1背包暴力解法,giegie不温柔了

0/1背包问题

有 n 件物品,第 i 件的重量和价值分别是 wi 和 vi 。要将这 n 件物品的一部分装入容量为c 的背包中,要求每件物品或整个装入或不装入。0/1背包问题就是要给出装包算法,使得装入背包的物品的总价值最大。本节采用回溯方法求解,选择出满足目标函数极大化和重量要求的一个子集。
0/1一般使用动态规划来写的,这里介绍的是暴力的回溯方法。

思路解析

解空间树:回溯方法的第一步就是确定解空间树,对于一个物品有要和不要两种选择。所以这是一颗二叉树。我们要得到的是一个解向量X={1,0,1,0,0…},表示选取那些节点。
在这里插入图片描述
怎么做呢?
1.对于效益数组V重量数组W,根据wi/vi(性价比)来排序。我们先把性价比高的放进去。
2.可是保证先放性价比最高的就能实现是最优结果吗?看看下面这里例子
在这里插入图片描述
因此,对性价比优先的方法做出改进。
即,加入判断:
如果在不选本物品,而把后面的物品尽可能的装入的情况下,价值比最大收益大,就继续递归
如果

import java.util.Arrays;

public class Bag0_1 {
    public static void main(String[] args) {
        int[] val ={60,100,120};
        int[] vol ={10,20,30};
        bag b=new bag(50,val,vol);
        b.sort();
        b.getIn(0,0,50);
        System.out.println(b.fv+"   "+Arrays.toString(b.BC));

    }
}

class bag{
/***
 * 属性:   1.容量C 2.价值数组val 3.体积数组vol 4.解向量X 5.最大效益fc 6.解向量长度n
 * 方法:   1.构造方法  2.性价比排序  3.回溯
 *   getIn(t,cv,r)
 *   t:当前步骤
 *   cv:当前价值
 *   cw:剩余容量
  */
    public int C,fv=-1,n;
    public int[] Val,Vol;
    public int[] X,BC;

    public bag(int c, int[] val, int[] vol) {
        C = c;
        Val = val;
        Vol = vol;
        X=new int[Val.length];
        n=X.length;
    }
    public int[] sort(){
        int[] X=new int[Val.length];
        for (int i=0;i<=Val.length-1;i++){
            X[i]=Val[i]/Vol[i];
        }
//        对X做一个冒泡排序
        for (int i=X.length-1;i>=0;i--){
            for (int j=0;j<i;j++){
                if (X[j]<X[j+1]){
                  X=swap(X,j,j+1);
                  Vol=swap(Vol,j,j+1);
                  Val=swap(Val,j,j+1);
                }
            }
        }
        return X;
    }
    public int[] swap(int[] X,int a,int b){
        int t;
        t=X[b];
        X[b]=X[a];
        X[a]=t;
        return X;
    }
    public void getIn(int t,int cv,int cw){
        if (t>=n&&cv>fv){
            fv=cv;
            BC=X;
        }
        else if (t<n){
            if (Vol[t]<=cw){
                X[t]=1;
                getIn(t+1,cv+Val[t],cw-Vol[t]);
            }
            if (cv+Rest(t+1,cw)>fv){
                X[t]=0;
                getIn(t+1,cv,cw);
            }
        }
    }
    public double Rest(int t,int rc){
        double rv=0;
        for (;t<n&&Vol[t]<=rc;t++){
            rv+=Val[t];
            rc-=Vol[t];
        }
        return rv;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于西部数据移动硬盘的驱动问题,你可以尝试以下解决方法。首先,确保你的电脑上已经安了最新的操作系统更新和驱动程序。如果问题仍然存在,你可以按照以下步骤来解决问题。首先,在设备管理器中找到"其他设备",展开该选项。检查是否有任何带有感叹号的驱动程序。如果有,右键单击该驱动程序并选择"卸载"。接下来,拔下移动硬盘,重新插上。再次检查设备管理器,确保驱动程序已经正确安。这样通常可以解决驱动问题。如果问题仍然存在,你可以尝试下载并安西部数据移动硬盘的SES Device驱动程序。这个驱动程序可以在西部数据的官方网站上找到。通过执行这些步骤,你应该能够解决西部数据移动硬盘的驱动问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [西部数据移动硬盘识别不了](https://blog.csdn.net/qq_35056292/article/details/69669093)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [西数移动硬盘SES驱动](https://download.csdn.net/download/mgudis/3473190)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值