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

复制代码
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);
    }
}
相关推荐
爱学习的小可爱卢几秒前
JavaEE进阶——Spring Bean与Java Bean的核心区别
java·后端·java-ee
期待のcode5 分钟前
Java Object 类
java·开发语言
weixin_461769407 分钟前
3. 无重复字符的最长子串
c++·算法·滑动窗口·最长字串
Morwit9 分钟前
【力扣hot100】 312. 戳气球(区间dp)
c++·算法·leetcode
悟能不能悟10 分钟前
如何处理 丢失更新(不可重复读)
java
李拾叁的摸鱼日常16 分钟前
Java Optional 最佳实践+注意事项+避坑指南
java·后端·面试
CoovallyAIHub19 分钟前
摄像头如何“看懂”你的手势?手势识别实现新人机交互
深度学习·算法·计算机视觉
雨中飘荡的记忆22 分钟前
MyBatis配置解析模块详解
java·mybatis
qq_124987075324 分钟前
基于微信小程序的科技助农系统的设计与实现(源码+论文+部署+安装)
java·大数据·spring boot·后端·科技·微信小程序·毕业设计
狂奔小菜鸡25 分钟前
Day35 | Java多线程入门
java·后端·java ee