贪心算法实例(四):部分背包问题

    本例背包问题不同于动态规划0-1背包问题,包可以部分分配。

    问题:在选择物品i装入背包时,可以选择物品的一部分,而不一定要全部装入背包。

    计算每种物品的单位重量价值作为贪心选择的依据指标,选择单位重量价值最高的物品,将尽可能多的该物品装入背包,依此策略一直地进行下去,直到背包装满为止。在程序中已经事先将单位重量价值按照从大到小的顺序排好。具体实现代码如下所示:

/**
 * @Title: KnapSack.java
 * @Package greedyalgorithm
 * @Description: TODO
 * @author peidong
 * @date 2017-5-17 上午9:22:44
 * @version V1.0
 */
package greedyalgorithm;

/**
 * @ClassName: KnapSack
 * @Description: 部分背包问题
 * @date 2017-5-17 上午9:22:44
 *
 */


public class KnapSack {

    public static final int N = 4;

    /**
     *
     * @Title: knapSack
     * @Description: 部分背包算法实现
     * @param M
     * @param v
     * @param w
     * @param x
     * @return void
     * @throws
     */
    public static void knapSack(float M, float[] v, float[] w, float[] x){
        int i;
        //物品被整装
        for(i = 1; i <= N; i++){
            if(w[i] > M)
                break;
            x[i] = 1;
            M-=w[i];
        }
        //物品散装
        if(i <= N)
            x[i] = M/w[i];
    }

    /**
     * @Title: main
     * @Description: 测试用例
     * @param args
     * @return void
     * @throws
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        float M = 50;
        //背包所能容纳的重量
        float[] w = {0, 10, 30, 20, 5};
        //每种物品的重量
        float[] v = {0, 200, 400, 100, 10};
        //每种物品的价值
        float[] x = {0, 0, 0, 0, 0};
        //记录结果的数组
        knapSack(M, v, w, x);
        System.out.println("选择装下的物品比例:");
        for(int i = 1; i <= N; i++){
            System.out.printf("["+i+"]"+x[i]+" ");
        }

    }

}


你可能感兴趣的:(基础算法)