java動的計画法は01ナップサック問題を解決します(アイテムを繰り返すことはできません)

1.動的計画法のコアアイデア:

大きな問題を小さな問題に分解して、最適な解を段階的に取得する処理アルゴリズム(グローバルな最適解を終了するためのローカルな最適解があります)

2.動的計画法と分割統治法の類似点:

大きな問題を小さな問題に分割し、小さな問題を解決することで元の問題を解決します

3.動的計画法と分割統治法の違い:

動的計画法のさまざまな小さな問題の間には関係があり、分割統治アルゴリズムは互いに独立しています。

4.動的計画法は、フォームに記入することで取得できます

演算結果:

 

package dataStruct.常用算法;

import java.util.ArrayList;
import java.util.Hashtable;

public class 动态规划求解01背包问题 {
    public static void main(String[] args) {
        //定义重量的数组
        int[] w = {1, 4, 3};
        //定义物品的价值
        int[] val = {1500, 3000, 2000};
        //定义不同重量的最大价值
        int n = 5;//定义背包的容量
        int[][] v = new int[w.length + 1][n + 1];
        int[][] path = new int[w.length + 1][n + 1];
        //对不同v[][]进行赋值
        for (int i = 1; i < v.length; i++) {
            for (int j = 1; j < v[0].length; j++) {
                //如果当前背包的容量小于第i个商品的重量,将上一行的值,复制到当前行
                if (j < w[i-1]) {
                    v[i][j] = v[i - 1][j];
                } else {//否则背包容量大于当前商品的重量
                    //如果当前商品的价值+背包减去当前商品的重量后,剩余容量的价值 > 上一行的价值,就将上一行的价值赋给当前行

                    if (v[i - 1][j] < val[i - 1] + v[i - 1][j - w[i - 1]]) {
                        v[i][j] = val[i - 1] + v[i - 1][j - w[i - 1]];
                        path[i][j] = 1;
                    } else {
                        v[i][j] = v[i - 1][j];
                    }
                }
            }
        }
        for (int i = 0; i < v.length; i++) {
            for (int j = 0; j < v[1].length; j++) {
                System.out.print(" " + v[i][j]);
            }
            System.out.println();
        }
        int i = path.length - 1;
        int j = path[0].length - 1;
        while (i > 0 && j > 0){
            if (path[i][j] == 1){
                System.out.printf("第%d个商品放到背包中\n",i);
                j -= w[i-1];//减掉当前商品的重量,为剩余重量
            }
            i--;
        }

    }
}

おすすめ

転載: blog.csdn.net/qq_52655865/article/details/122456346