Greedy for Fractional Knapsack

部分背包(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;

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

 

posted @ 2016-04-26 22:51  小菁菁爱吃番茄酱  阅读(412)  评论(0编辑  收藏  举报