千家信息网

Java怎么实现背包动态规划

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,本篇内容主要讲解"Java怎么实现背包动态规划",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Java怎么实现背包动态规划"吧!背包问题【题目描述】一个旅行
千家信息网最后更新 2026年11月04日Java怎么实现背包动态规划

本篇内容主要讲解"Java怎么实现背包动态规划",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Java怎么实现背包动态规划"吧!

背包问题

【题目描述】
一个旅行者有一个最多能装 MM 公斤的背包,现在有 nn 件物品,它们的重量分别是W1,W2,…,WnW1,W2,…,Wn,它们的价值分别为C1,C2,…,CnC1,C2,…,Cn,求旅行者能获得最大总价值。

【输入】
第一行:两个整数,MM(背包容量,M<=200M<=200)和NN(物品数量,N<=30N<=30);

第2…N+12…N+1行:每行二个整数Wi,CiWi,Ci,表示每个物品的重量和价值。

【输出】
仅一行,一个数,表示最大总价值。

【输入样例】
10 4
2 1
3 3
4 5
7 9
【输出样例】
12

我们可以通过自己打表的方式找变化求得状态方程
(横向表示容量,j)(纵向表示第几个,i)
#1 2 3 4 5 6 7 8 9 10
1 0 1 1 1 1 1 1 1 1 1
2 0 1 3 3 4 4 4 4 4 4
3 0 1 3 5 5 6 8 8 9 9
4 0 1 3 5 5 6 9 9 10 12

dp[i][j]----i表示物品个数,j表示容量,dp[i][j]的值表示在此状态的最大价值
由此我们可以写出状态转移方程:

if(j

完整代码如下:

import java.util.*;public class Main {    public static void main(String[] args) {        Scanner in = new Scanner(System.in);        int m, n;        int[] w = new int[35];        int[] v = new int[35];        m = in.nextInt();        n = in.nextInt();        int[][] dp = new int[35][205];//m容量,n数目个数        for (int i = 1; i <= n; i++) {            w[i] = in.nextInt();            v[i] = in.nextInt();        }        for (int i = 1; i <= n; i++) {            for (int j = 1; j <= m; j++) {                if(j

当然,如果容量数字和物品个数很大的时候,这个表会很大,但是dp数组只与自己的上一次有关,会造成空间浪费,所以我们可以改进成滚动数组,减小空间,使其变成一维数组。

小tips:因为是滚动数组,所以如果第二层循环从1开始的话,可能会覆盖上一次的值,所以第二层循环的时候我们从后往前开始!

import java.util.*;import java.lang.*;public class Main {    static int[]dp=new int[205];    static int[] w = new int[35];    static int[] v = new int[35];    public static void main(String[] args) {        Scanner in = new Scanner(System.in);        int m, n;        m = in.nextInt();        n = in.nextInt();//        int[][] dp = new int[35][205];//m容量,n数目个数        for (int i = 1; i <= n; i++) {            w[i] = in.nextInt();            v[i] = in.nextInt();        }        for (int i = 1; i <= n; i++) {            for (int j = m; j >= 1; j--) {                if(j>=w[i])                {                    dp[j]=Math.max(dp[j],dp[j-w[i]]+v[i]);                }            }        }        //输出dp数组//        for (int i = 1; i <= n; i++) {//            for (int j = 1; j <= m; j++) {//                System.out.print(dp[i][j]+" ");//            }//            System.out.println();//        }//        System.out.println(dp[n][m]);        System.out.println(dp[m]);        in.close();    }}

到此,相信大家对"Java怎么实现背包动态规划"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

容量 背包 数组 个数 物品 输出 动态 规划 最大 价值 状态 重量 j++ 上一 很大 一行 二层 内容 总价 总价值 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 小米移动互联网科技园 互联网佳科技有限公司 港股互联网科技股 金融科技与互联网金融 安徽鑫晟辉互联网科技 互联网科技视频素材 互联网科技公司名称 互联网科技公司做什么 丰台科技园 互联网公司 互联网科技博主是什么意思 广州慧亚互联网科技怎么样 互联网金融科技公司干啥的 互联网科技和信息 锡山区互联网智能科技产品供应 黑云互联网科技有限公司 互联网科技数字货币 35岁以上互联网科技行业 科技互联网公司两年变化 互联网大会出现的黑科技 小牛互联网科技有限公司地址 互联网的科技 易通互联网络科技有限公司 佰商互联网科技有限公司 太原新华互联网科技学校怎么样 杭州壁岐互联网科技有限公司 民营互联网公司国防科技 南通创西澳互联网科技有限公司 北京市互联网新科技 九思连强互联网电子科技有限公司 互联网科技品牌
0