动态规划法解0-1背包问题

0-1背包问题:有一个贼在偷窃一家商店时,发现有n件物品,第i件物品价值vi,重wi。他希望带走的东西越值钱越好,但他的背包中至多只能装下C的东西。应该带走哪几样东西,使得装入背包的物品价值最大?这个问题之所以称为0-1背包,是因为每件物品或被带走;或被留下;小偷不能只带走某个物品的一部分或带走同一物品两次。

动态规划法解题的步骤:

1. 找出最优解的性质;

2. 递归地定义最优值;

3. 以自底向上的方式计算最优值;

4. 根据计算最优值过程中得到的信息,构造最优解;

package ch03.book;

/**
 * Resolve 0-1 backpack problem using dynamic planning 
 * @author wanyongquan
 * 
 */
public class Backpack {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] weight = {35, 30, 60, 50, 40, 10, 25};
		int[] profit = {10, 40, 30, 50, 35, 40, 30};
		int[][] maxProfit = new int[weight.length][151];
		backpack(profit, weight, 150, maxProfit);
		int[] solution = new int[weight.length];
		trackback(maxProfit, weight, 150, solution);
		
		// 
		for(int i=0;i0; i--) {
			jMax = Math.min(weight[i] -1, capacity);
			for(int j= 0; j= weight[0]) {
			m[0][capacity] = Math.max(m[1][capacity], m[1][capacity-weight[0]] + value[0]);
		}
		else{
			m[0][capacity] = m[1][capacity];
		}
	}
   /**
    * 根据backpack算法计算后得到的信息,计算出最优解;
    */
	public static void trackback(int[][]m , int[] weight, int capacity, int [] solution) {
		int n = weight.length-1;
		for(int i = 0; i 0? 1:0;
		
	}
}

运行结果: 

  solution:

1   1   0   1   0   1   1

max proft: 170

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