动态规划经典问题——01背包问题

1.问题引入

在这里插入图片描述

2.Bellman equation

分解为子问题,寻找子问题间的依赖关系。
在这里插入图片描述
第二行——肯定不选择物品i;
第三行——进行判断是否选择物品i。

伪代码:

在这里插入图片描述

3.java实现

/*
 * 用动态规划解决背包问题
 */
public class BackBag {
    
    
	
	
	public static int[][] getMaxValue(int[] values,int weights[],int capacity) {
    
    
		
		int n = values.length;//物体数目
		
		int opt[][] = new int[n+1][capacity+1];
		
		for (int w = 0; w <= capacity; w++) {
    
    
			opt[0][w] = 0;
		}
		
		//填表
		for (int i = 1; i <= n; i++) {
    
    
			int j = i-1;//第j个物品
			for (int w = 0; w <= capacity; w++) {
    
    
				if (weights[j]>w) {
    
    
					opt[i][w] = opt[i-1][w];//肯定不选第i个物品
				}else {
    
    
					//进行判断是否要选择第i个物体
					opt[i][w] = (opt[i-1][w-weights[j]]+values[j])>opt[i-1][w]?opt[i-1][w-weights[j]]+values[j]:opt[i-1][w];
				}
			}
		}
		
		
//		return opt[n][capacity];
		return opt;
		
	}
	

	public static void main(String[] args) {
    
    
		
		int[] values = {
    
    18,22,28,1,6};
		int[] weights = {
    
    5,6,7,1,2};
		
//		int[] values = {12,3,10,3,6};
//		int[] weights = {5,4,7,2,6};
		
		int capacity = 11;
		
		int[][] max_value = getMaxValue(values,weights,capacity);
		
//		System.out.println("动态规划解决背包问题获得的最大价值为:"+max_value);
		for (int i = 0; i < max_value.length; i++) {
    
    
			for (int j = 0; j < max_value[0].length; j++) {
    
    
				System.out.print(max_value[i][j]+"   ");
			}
			System.out.println();
		}
	}


}

4.总结

解决动态规划问题的关键在于寻找子问题间的依赖关系——即写出Bellmen方程。

猜你喜欢

转载自blog.csdn.net/joey_ro/article/details/109755818