首页 > 编程语言 >动态规划完全背包问题-java

动态规划完全背包问题-java

时间:2024-04-05 11:03:41浏览次数:22  
标签:背包 java int 体积 物品 new 动态 dp

完全背包问题跟01背包问题思路大致一样,只不过对于物品的拿取次数不在限制,我们只需要考虑这点即可。

文章目录

前言

一、什么是完全背包问题?

二、问题模拟

1.样例数据

2.算法思路

三、代码如下

1.代码如下(示例):

2.读入数

3.代码运行结果

总结


前言

完全背包问题跟01背包问题思路大致一样,只不过对于物品的拿取次数不在限制,我们只需要考虑这点即可。


提示:以下是本篇文章正文内容,下面案例可供参考

一、什么是完全背包问题?

有n种物品和一个bag大小的背包容量,每种物品都有无限件可以使用,每个物品都有体积v和价值w,求解背包所能容纳的最大价值是多少?

二、问题模拟

1.样例数据

假设我们还有有4种物品和一个容量为5的背包,这四种物品对应的体积和价值分别为:

  • 物品一:体积是1,价值是2
  • 物品二:体积是2,价值是4
  • 物品三:体积是3,价值是4
  • 物品三:体积是4,价值是5

2.算法思路

数组v[i]表示第i种物品的体积,w[i]表示第i种物品的价值。

我们引入dp状态数组,行数i表示第几种物品,列数j表示背包的容量j,dp[i][j] 表示在当前背包容量j下 选取第i种物品后所能容纳的最大价值。

dp[i][j]的计算可以通过以下的推算进行:

  • 选取0个第i种物品即不选取新物品,即对应dp[i-1][j]
  • 选取1个第i种物品,dp[i-1][j-v[i]]+w[i]
  • 选取2个第i种物品,dp[i-1][j-2*v[i]]+2*w[i]

上述过程不会无限增加,因为我们有背包容量j,那么我们就可以得到一个极限条件,假设当前背包容量j下最多可得到t个物品,t*v[i] \leqslant j

t = \frac{j}{v[i]}

那么完全背包的状态就是我们在不拿新物品、拿1件新物品、拿2件新物品等等直到最多拿k件新物品中比较得到的最大值即为dp[i][j]的值 

dp[i][j] = \max dp[i][j-k*v[i]]+k*w[i] 0\leqslant k\leq t

那么我们就可以得到dp数组的递推代码:

        //第几种物品
        for(int i = 1;i <= n;i++){
            //背包容量
            for(int j = 1;j <= bag;j++){
                //表示在当前背包容量j下最多再放t个第i种物品
                int t = j / v[i];
                for(int k = 0;k <= t;k++){
                    dp[i][j] = Math.max(dp[i][j],dp[i-1][j-k*v[i]] + w[i] * k);
                }
            }
        }

3.代码优化

我们 通过观察可以发现,其实k循环可以舍弃掉,完全背包问题dp[i][j]我们可以通过每次累加v[i],当j < v[i],我们相当于没加取上一个物品的最佳状态,dp[i][j] = dp[i-1][j]。当j >= v[i],那我们就取当前第i个物品然后背包容量j-v[j]时的最大价值+w[i],dp = max{dp[i-1][j],dp[i][j-v[i]]+w[i]}

 

        //第几种物品
        for(int i = 1;i <= n;i++){
            //背包容量
            for(int j = 1;j <= bag;j++){
                dp[i][j] = dp[i-1][j];
                if(j - v[i] >= 0){
                    dp[i][j] = Math.max(dp[i][j],dp[i][j-v[i]]+w[i]);
                }
            }
        }

图2.1dp数组值 

三、代码如下

1.代码如下(示例):

package AcWing;

import java.io.*;

public class 完全背包问题 {
    static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
    public static void main(String[] args) throws Exception{
        int n = nextInt(),bag = nextInt();
        int[][] dp = new int[n+1][bag+1];
        //体积
        int[] v = new int[n+1];
        //价值
        int[] w = new int[n+1];
        for(int i = 1;i <= n;i++){
            v[i] = nextInt();
            w[i] = nextInt();
        }
        //第几种物品
        for(int i = 1;i <= n;i++){
            //背包容量
            for(int j = 1;j <= bag;j++){
                //表示在当前背包容量j下最多再放t个第i种物品
                int t = j / v[i];
                for(int k = 0;k <= t;k++){
                    dp[i][j] = Math.max(dp[i][j],dp[i-1][j-k*v[i]] + w[i] * k);
                }
            }
        }
        pw.println(dp[n][bag]);
        pw.flush();
    }
    public static int nextInt()throws Exception{
        st.nextToken();
        return (int)st.nval;
    }
}

2.读入数据

4 5
1 2
2 4
3 4
4 5

3.代码运行结果

10

总结

上面主要是对完全背包问题进行一个解释,我们还是主要理解dp数组的含义以及状态转移方程如何得出来。

标签:背包,java,int,体积,物品,new,动态,dp
From: https://blog.csdn.net/m0_63267251/article/details/137380721

相关文章

  • java计算机毕业设计(附源码)影视创作论坛系统(ssm+mysql+maven+LW文档)
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:随着科技的不断进步和互联网的普及,影视创作行业也在经历着前所未有的变革。传统的影视创作模式已经无法满足现代社会的需求,而新兴的影视创作论坛系统则应......
  • java计算机毕业设计(附源码)影视游戏推广系统(ssm+mysql+maven+LW文档)
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:随着数字媒体时代的到来,影视和游戏产业迎来了前所未有的发展机遇。影视作品以其生动的叙事和视听效果吸引着全球观众,而游戏则以其互动性和沉浸式体验成为......
  • idea开发 java web 配电室后台管理系统bootstrap框架web结构java编程计算机网页
    一、源码特点 java配电室后台管理系统是一套完善的完整信息系统,结合javaweb开发和bootstrapUI框架完成本系统,对理解JSPjava编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。前段主要技术cssjquery bootstrapUI框架后端主要技术javaj......
  • (Java)数据结构——图(第三节)BFS的实现
    前言本博客是博主用于复习数据结构以及算法的博客,如果疏忽出现错误,还望各位指正。广度优先搜索的原理好了,还是这张图,不过是广度优先搜索不难看出,就是“一层一层”搜这次咱从A开始,因为如果从B开始的话,只需要一次,搜索过程就是B直接搜完,入队ACDE,isVistied全部ture,结束......
  • Java -fastjson api
    构造json对象需求:构造以下请求体{"attrSelectionVO":[{"attrAccessId":"eea99a0894504a2b89f3cfeb4be051d3","attrValueList":[{"attrValue":"输送型","att......
  • Java.lang.OutOfMemoryError: GC overhead limit exceeded
    缘由系统是微服务架构,在服务器上跑了近11个微服务,某天发布更新部署新功能,几分钟后发现系统跑着跑着崩了。。。排查通过对11个微服务运行打印的日志,发现只有基础微服务日志中出现了GCoverheadlimitexceeded报错信息,然后从报GC异常的上一个报错的异常进行定位,发现是因为某......
  • Vue3 Diff 之 patchKeyedChildren 动态示例
    在学习全网学习各路大神的关于Vue3Diff算法分析文章的时候,一定离不开关键方法patchKeyedChildren。patchKeyedChildren处理的场景比较多,大致有5个主要过程。如果你希望查看不同测试用例下,patchKeyedChildren具体的内部处理过程,可以尝试一下这个:《Vue3Diff之patchKey......
  • Java项目:基于Springboot+vue实现的医院住院管理系统设计与实现(源码+数据库+开题报告+
    一、项目简介本项目是一套基于Springboot+vue实现的医院住院管理系统设包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。项目都经过严格调试,eclipse或者idea确保可以运行!该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值......
  • 【附源码】计算机毕业设计智慧社区团购系统的设计(java+springboot+mysql+mybatis+论文
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义随着互联网技术的发展和普及,社区团购作为一种新兴的电商模式,正逐渐改变着人们的购物习惯。然而,传统的社区团购系统存在着一些问题,如信息不透明、效率低下、用户体......
  • 【附源码】计算机毕业设计游戏分享网站(java+springboot+mysql+mybatis+论文)
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义随着互联网技术的发展,游戏行业正逐渐向数字化、网络化方向发展。越来越多的游戏玩家开始通过网络分享自己的游戏心得、攻略和视频等内容,形成了一个庞大的游戏分享......