動的計画法の古典的な問題-01ナップサック問題

1.問題の紹介

ここに画像の説明を挿入

2.ベルマン方程式

サブ問題に分解し、サブ問題間の依存関係を探します。
ここに画像の説明を挿入
2行目-絶対にアイテムiを選択しない、
3行目-アイテム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.まとめ

動的計画問題を解くための鍵は、サブ問題間の依存関係を見つけること、つまり、ベルメン方程式を書くことです。

おすすめ

転載: blog.csdn.net/joey_ro/article/details/109755818