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

复制代码
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);
    }
}
相关推荐
kong7906928几秒前
Java基础-Lambda表达式、Java链式编程
java·开发语言·lambda表达式
码农水水8 分钟前
小红书Java面试被问:Online DDL的INSTANT、INPLACE、COPY算法差异
算法
liangsheng_g15 分钟前
泛型新认知
java·序列化·泛型
液态不合群21 分钟前
【面试题】MySQL 三层 B+ 树能存多少数据?
java·数据库·mysql
iAkuya1 小时前
(leetcode)力扣100 34合并K个升序链表(排序,分治合并,优先队列)
算法·leetcode·链表
我是小狼君1 小时前
【查找篇章之三:斐波那契查找】斐波那契查找:用黄金分割去“切”数组
数据结构·算法
李坤林1 小时前
Android Binder 详解(4) Binder 线程池
android·java·binder
代码方舟1 小时前
Java后端实战:构建基于天远手机号码归属地核验的金融级风控模块
java·大数据·开发语言·金融
困知勉行19851 小时前
springboot整合redis
java·spring boot·redis
颜淡慕潇1 小时前
深度解析官方 Spring Boot 稳定版本及 JDK 配套策略
java·后端·架构