经典0-1背包问题

每天都有进步自然是好的(套用寰姐姐的话)

0-1背包问题贪心算法:

/**
 * 1."0-1"背包问题的贪心算法:给定n种物品和一个背包,物品i的重量是Wi,其价值是Vi,
 *   背包的容量为C,问如何选择装入背包中的物品,使得装入背包的物品总价值最大?
 * 
 */
package algorithm2;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;

public class Pack01 {
	double[] wt = null;
	public static double c = 100; // 代表背包的重量
	List list = null;  //存储所有输入的值
	List list2 = null; //存储最优结果值
	public List generate(int n) {
		list = new ArrayList();   //实例化链表
		System.out.println("请依次输入"+n+"物品的重量和价值");
		for (int i = 0; i < n; i++) { // 产生n个物品
			System.out.println("请输入第"+(i+1)+"个物品的重量和价值:");
			Good good = new Good();
			Scanner sc = new Scanner(System.in);
			good.wi = sc.nextDouble();
			good.vi = sc.nextDouble();
			good.xi = false; // 放入包中为true
			good.vx = good.vi / good.wi;
			list.add(good);      //将物品放入List链表中
		}
		//System.out.println(list);
		return list;
	}

	public void knapsack(int n, List list) {
		// 按照good的单位价值由大到小排序
		Comparator<Good> comparator = new Comparator<Good>() {
			public int compare(Good g1, Good g2) {
				// 按照单位价值的重量进行排序
				if ((g1.vx - g2.vx) >= 0) {
					return 1;
				} else {
					return 0;
				}

			}
		};
		// 按照物品的单位重量价值量进行排序
		list2 = new ArrayList();
		Collections.sort(list, comparator);
		wt = new double[n];
		Iterator ita = list.iterator();
		for (int i = 0; i < list.size(); i++) {
		
			Good good = (Good) list.get(i);
			wt[i] = good.wi;
			if (wt[i] > c)
				break;
			else {
				good.xi = true;
				c -= wt[i];
				list2.add(good);    //将合适的good对象重新加入list中
			}
		}
		//依次打印出合适的good对象的每个元素
		for(Iterator it = list2.iterator();it.hasNext(); ){
			Good god = (Good) it.next(); 
			System.out.println(god.wi+" "+god.vi+" "+god.vx+" "+god.xi);
		}
//System.out.println(list);
	}

	public static void main(String[] args) {
		Pack01 pack = new Pack01();
		List list = pack.generate(4);
		pack.knapsack(4, list);
	}
}

// 每个对象代表一个物品
class Good {
	public double wi; // 代表物品的重量
	public double vi; // 代表物品的价值
	public boolean xi; // 代表物品是否装入
	public double vx; // 代表单位重量的价值
}
经典0-1背包问题_第1张图片

你可能感兴趣的:(java,算法设计,0-1背包贪心策略)