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

来源:互联网 发布:多益网络校招笔试题 编辑:程序博客网 时间:2024/05/02 01:43

    本例背包问题不同于动态规划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]+" ");        }    }}


原创粉丝点击