Greedy for Fractional Knapsack

本文介绍了一种解决部分背包问题的方法,使用Java实现了一个名为FractionalKnapsack的类,通过计算物品的价值与重量比来确定如何填充背包以最大化价值。文章提供了一个具体的例子并展示了输出结果。

部分背包(Fractional Knapsack)

按性价比排好序列

一个一个往进去装直到最后一个不能全装进去计算比例

JAVA

public class FractionalKnapsack {
        public static float[] GREEDY_KNAPSACK(int[] w,int W,int[] v)
    {
        int i;
        int n=w.length;//总共有多少个物品,用w.length/v.length都可以
        float[] x=new float[n];
        for(i=0;i<n;i++)
        {
            x[i]=0;//初始化
        }
        float c=W;//c是包剩余容量        
        for(i=0;i<n;i++)
        {
            if(w[i]<=c)//如果第i个物品的重量<剩余容量
            {
                x[i]=1;//全部取出,比例百分百
                c=c-w[i];//改变剩余容量
            }
            else break;//跳出循环
        }
        if(i<n&&c>0)
            x[i]=c/w[i];//算出剩下能装的容量占这个物品的比例,也就是取出的比例
        return x;
        
    }
    public static void PRINTARRAY(float[] array) {
        System.out.print("{");
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i]);
            if (i < array.length - 1) {
                System.out.print(", ");
            }
        }
        System.out.println("}");
    }
    public static void main(String[] args)
    {
        int [] A={65,20,30,60,40};
        int [] B={30,10,20,50,40};
        float [] x=GREEDY_KNAPSACK(B,100,A);
        PRINTARRAY(x);
    }

}

輸出:{1.0, 1.0, 1.0, 0.8, 0.0}

比例不是整數改爲用float;

性價比排序現為人爲排序,待修改

 

转载于:https://www.cnblogs.com/Ljj-Nancy/p/5437037.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值