实现一个动态规划算法,解决背包问题

复制代码
public class Test_31 {
    // 动态规划解决0-1背包问题
    public int knapsack(int capacity, int[] weights, int[] values, int n) {
        // 创建一个二维数组dp,用于记录状态转移过程
        int[][] dp = new int[n + 1][capacity + 1];

        // 遍历物品
        for (int i = 1; i <= n; i++) {
            // 遍历背包容量
            for (int w = 1; w <= capacity; w++) {
                if (weights[i - 1] > w) {
                    // 当前物品重量大于背包容量,无法放入,取上一个状态的值
                    dp[i][w] = dp[i - 1][w];
                } else {
                    // 否则比较放入当前物品和不放入当前物品两种情况的最大价值
                    dp[i][w] = Math.max(dp[i - 1][w], values[i - 1] + dp[i - 1][w - weights[i - 1]]);
                }
            }
        }

        // 返回背包问题的最优解
        return dp[n][capacity];
    }

    public static void main(String[] args) {
        Test_31 knapsackProblem = new Test_31();
        int capacity = 15;
        int[] weights = {2, 3, 4, 5};
        int[] values = {3, 4, 5, 6};
        int n = weights.length;

        // 计算获得的最大价值
        int maxValue = knapsackProblem.knapsack(capacity, weights, values, n);
        System.out.println("The maximum value that can be obtained is: " + maxValue);
    }
}
相关推荐
步步为营DotNet1 分钟前
深度探索.NET 中ValueTask:优化异步性能的轻量级利器
java·spring·.net
栈与堆4 分钟前
LeetCode-88-合并两个有序数组
java·开发语言·数据结构·python·算法·leetcode·rust
董世昌417 分钟前
添加、删除、替换、插入元素的全方法指南
java·开发语言·前端
源代码•宸12 分钟前
Leetcode—712. 两个字符串的最小ASCII删除和【中等】
开发语言·后端·算法·leetcode·职场和发展·golang·dp
小当家.10513 分钟前
JVM八股详解(上部):核心原理与内存管理
java·jvm·学习·面试
heartbeat..13 分钟前
Spring 声明式事务:原理、使用及失效场景详解
java·spring·面试·事务
寻星探路14 分钟前
【Python 全栈测开之路】Python 基础语法精讲(三):函数、容器类型与文件处理
java·开发语言·c++·人工智能·python·ai·c#
xiaolyuh12315 分钟前
【XXL-JOB】执行器 Netty服务 & Tomcat 进程+资源共用详解
java·tomcat
无限进步_15 分钟前
【C语言&数据结构】相同的树:深入理解二叉树的结构与值比较
c语言·开发语言·数据结构·c++·算法·github·visual studio
jasnet_u19 分钟前
SpringCloudAlibaba的web微服务快速搭建
java·springboot·springlcoud