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