首页 > 其他 > 详细

部分背包-贪心

时间:2020-05-16 14:05:26      阅读:38      评论:0      收藏:0      [点我收藏+]

例子:

背包容量为W=20,有n=3个价值为v={18,15,10},重量为w={25,24,15}的物品。可以部分选择物品加入到背包中,使得背包中的总价值最大,求每件物品的选择配比解向量x。

?

分析:

  1. 显然只有将背包填满才能获得最大价值。
  2. 根据每件物品的单位价值,按照从小到大加入到背包中,就能获得最大价值。

    ?

    递推式:

  3. 首先按照单位价值的大小从大到小进行排序,存放在uv中。
  4. 如果技术分享图片将物品i整个加入到背包中。
  5. 如果技术分享图片将物品i的部分Wa加入到背包中。

    ?

    Java实现代码:

    public final class exp_5 {

    ????private exp_5(){

    ????????

    ????}

    ????public static double[] getX(int W,int[] w,int[] v){

    ????????//存放单位价值的数组

    ????????double[] uv = new double[w.length];

    ????????for(int i=0;i<w.length;i++){

    ????????????uv[i] = (double)v[i]/(double)w[i];

    ????????}

    ????????//存放结果的X,存放单位价值数组排序后各个下标的pos

    ????????double[] X = new double[uv.length];

    ????????int[] pos = MathUtil.sort(uv, false);

    ????????//X

    ????????for(int i=0;i<uv.length;i++){

    ????????????if(w[pos[i]] <= W){

    ????????????????X[pos[i]] = 1;

    ????????????????W -= w[pos[i]];

    ????????????}else{

    ????????????????X[pos[i]] = (double)W/(double)w[pos[i]];

    ????????????????W = 0;

    ????????????}

    ????????}

    ????????return X;

    ????}

    }

部分背包-贪心

原文:https://www.cnblogs.com/jawide/p/12899877.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!