哎,以前算法没有学好,现在找工作笔试动态规划又是必考,其中背包问题又经常遇见,今天给大家介绍几种常见的背包问题。如有误解请大家指导,谢谢。

先说一下算法的主要思想,利用动态规划来解决。每次遍历到的第i个物品,根据w[i]和v[i]来确定是否需要将该物品放入背包中。即对于给定的n个物品,设v[i]、w[i]分别为第i个物品的价值和重量,maxw为背包的容量。再令v[i][j]表示在前i个物品中能够装入容量为j的背包中的最大价值。则我们有下面的结果:

(1)v[i][0]=v[0][j]=0;

(2)v[i][j]=v[i-1][j] 当w[i]>j

(3)v[i][j]=max{v[i-1][j],v[i-1][j-w[i]]+v[i]} 当j>=w[i]

好的,我们的算法就是基于此三个结论式。

01背包(二维数组求解):

public class _01背包 {public static void main(String[] args) {int[] w = {2,1,6,4,3};//物品重量int[] v = {4,3,5,1,2};//物品价值int maxw = 12;//背包容量int len = v.length;//物品个数int[][] f = new int[len+1][maxw+1];int i,j;for(i = 1; i < f.length; i++){for(j = 1; j < f[0].length; j++){if(w[i-1] > j)f[i][j] = f[i-1][j];else {if(f[i-1][j] < f[i-1][j-w[i-1]] + v[i-1]){f[i][j] = f[i-1][j-w[i-1]] + v[i-1];}else {f[i][j] = f[i-1][j];}}}}for(i = 0; i < f.length; i++){for(j = 0; j < f[0].length; j++)System.out.print(f[i][j] + " ");System.out.println();}}
}

如果题目要求给出是哪几个物品放入其中,则我们在代码里面加入一个标记数组:

public class sf {public static void main(String[] args) {// TODO Auto-generated method stubint[] weight = {3,5,2,6,4}; //物品重量int[] val = {4,4,3,5,3}; //物品价值int m = 12; //背包容量int n = val.length; //物品个数int[][] f = new int[n+1][m+1]; //f[i][j]表示前i个物品能装入容量为j的背包中的最大价值int[][] path = new int[n+1][m+1];//初始化第一列和第一行for(int i=0;i<f.length;i++){f[i][0] = 0;}for(int i=0;i<f[0].length;i++){f[0][i] = 0;}//通过公式迭代计算for(int i=1;i<f.length;i++){for(int j=1;j<f[0].length;j++){if(weight[i-1]>j)f[i][j] = f[i-1][j];else{if(f[i-1][j]<f[i-1][j-weight[i-1]]+val[i-1]){f[i][j] = f[i-1][j-weight[i-1]]+val[i-1];path[i][j] = 1;}else{f[i][j] = f[i-1][j];}//f[i][j] = Math.max(f[i-1][j], f[i-1][j-weight[i-1]]+val[i-1]);}}}for(int i=0;i<f.length;i++){for(int j=0;j<f[0].length;j++){System.out.print(f[i][j]+" ");}System.out.println();}int i=f.length-1;int j=f[0].length-1;while(i>0&&j>0){if(path[i][j] == 1){System.out.print("第"+i+"个物品装入 ");j -= weight[i-1];}i--;}}}

一维数组(无需装满):

public class _01背包一维数组无需装满 {public static void main(String[] args) {//int[] weight = {3,5,2,6,4}; //物品重量//int[] val = {4,4,3,5,3}; //物品价值int[] w = {3,5,2,6,4};int[] v = {4,4,3,5,3};int maxw = 12;int[] f = new int[maxw+1];int i,j;for(i = 0; i < f.length; i++)f[i] = 0;for(i = 0; i < v.length; i++){for(j = f.length - 1; j >= w[i]; j--){//f[j] = f[j] > (f[j-w[i]] + v[i]) ? f[j] : (f[j-w[i]] + v[i]);f[j] = Math.max(f[j], f[j-w[i]] + v[i]);}}for(i = 0; i < f.length; i++)System.out.print(f[i] + " ");System.out.println();}}

一维数组(装满):

public class _01背包需装满 {public static void main(String[] args) {int[] w = {3,5,2,6,4};int[] v = {4,4,3,5,3};int maxw = 3;int[] f = new int[maxw+1];int i,j;for(i = 1; i < f.length; i++)f[i] = Integer.MIN_VALUE;for(i = 0; i < v.length; i++)for(j = f.length - 1; j >= w[i]; j--)f[j] = f[j] > (f[j-w[i]] + v[i]) ? f[j] : (f[j-w[i]] + v[i]);//f[j] = Math.max(f[j], f[j-w[i]] + v[i]);for(i = 0; i < f.length; i++)System.out.print(f[i] + " ");}}

注:装满和不装满主要区别是在与它们起始数组的初始化。无需装满初始化全为0,而需要装满的初始化f[0] = 0;其余各项1,2…n则置为Integer.MIN_VALUE,你可以这样理解,全部装满只有在一个物品重量为0时才能装入其它的则无需定义。

完全背包:
完全背包和01背包思想一样,只是先从物品重量开始计数,01背包是以从0开始计数,重量作为判断。

public class _完全背包 {public static void main(String[] args) {int[] w = {3,4,6,2,5};int[] v = {6,8,7,5,9};int maxw = 10;int[] f = new int[maxw+1];int i,j;for(i = 0; i < v.length; i++)for(j = w[i]; j <= f.length-1; j++)f[j] = f[j] > f[j-w[i]] + v[i] ? f[j] : f[j-w[i]] + v[i];for(i = 0; i < f.length; i++)System.out.print(f[i] + " ");}}

以上纯属个人见解,如有错误求各位大佬不吝指教。

Java实现背包问题之01背包(是否装满),完全背包相关推荐

  1. 背包问题教程-01背包,完全背包,多重背包,混合背包 收藏

    P01: 01背包问题 题目 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大. 基本思路 这是最基础的背包问题,特点是:每种物品仅有 ...

  2. 动态规划 —— 背包问题 P01 —— 0-1背包

    [概述] 0-1背包问题是最基本的背包问题,它包含了背包问题中设计状态.方程的最基本思想,另外,别的类型的背包问题往往也可以转换成0-1背包问题求解. 特点:每种物品仅有一件,可以选择放或不放. [题 ...

  3. C++背包问题——完全背包必须装满的方案数

    想要了解"完全背包必须装满的方案数",就得先了解 完全背包 ,点击下面方框查看(会的也看一看): C++ 背包问题--完全背包_闪耀的天狼星的博客-CSDN博客一个旅行者有一个最多 ...

  4. Python3使用动态规划处理背包问题:完全背包(含背包恰好装满的情况)

    文章目录 题目介绍 题解1 题解2 题解3 完全背包问题是基于01背包的,如果对01背包问题不熟悉,可以参考: Python3使用动态规划处理01背包问题 题目介绍 原题链接:NC309 完全背包 描 ...

  5. 494. 目标和 - 01背包中装满背包有几种方法的问题

    ✅01背包中"装满背包有几种方法"的问题 这道题难就难在如何把题面转化为背包问题

  6. 动态规划 背包问题小结 0-1背包(采药 九度第101题) 完全背包(Piggy-Bank POJ 1384) 多重背包(珍惜现在,感恩生活 九度第103题)

    本小结介绍0-1背包.完全背包以及多重背包问题 记忆要点: 0-1背包:二维数组情况下,顺序遍历体积或者倒序均可以                降维情况下需倒序遍历体积 完全背包:数组降维+顺序遍历 ...

  7. 背包问题-【01背包】【完全背包】【多重背包】【多限定条件背包】

    背包问题 给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高. 可参考https://www.cnblogs.com/-guz/p/9866118.h ...

  8. 01背包的变形问题----背包恰好装满

    01背包的变形问题----背包恰好装满 在看本文之前建议先看一下我之前发过的01背包详解. https://blog.csdn.net/Iseno_V/article/details/10000113 ...

  9. 背包问题_(DP经典),一,(01背包,填满背包)

    背包系列已更新 一,(01背包,填满背包) 二,(多重背包) 三,(完全背包) 目录 一,01背包(对于一个物品,你要么全拿,要么不拿) 核心dp方程,dp[i][j]=max(dp[i-1][j], ...

最新文章

  1. libreoffice
  2. python考试编程题九道_一道逻辑推理题的程序实现(纯属娱乐)
  3. Nginx【学习笔记】
  4. fprintf 和 perror 的理解1
  5. 微信小程序简介、发展史、小程序的优点、申请账号、开发工具、初识wxml文件和wxss文件
  6. php mysql.dll 下载_php_mysql.dll下载|
  7. my sql实验视图_数据库SQL 视图的创建及使用实验报告(共5篇)
  8. 用计算机绘制函数图像ppt,ppt怎么制作函数图
  9. 《实时控制软件设计》团队项目分组
  10. macOS - 安装 swig 、PCRE
  11. 《计算机工程》从投稿到录用之一手经验
  12. 苹果或研发第二代智能手表
  13. Ruoyi框架学习总结--总览篇
  14. 京东到家话费券系统NIO实战
  15. Java UT用例实践记录
  16. 组件容器服务器的关系,什么是docker 容器编排
  17. LeetCode刷题(python)——476. 数字的补数
  18. 计算机网络性能常见参数,计算机网络参数及其对网络性能的影响
  19. 7.1.5、Sqoop__sqoop常用命令参数,import,export,hive,数据库连接,hbase等
  20. IEEE754 详点

热门文章

  1. php qq昵称,自写与收集的一些免费的API接口(获取QQ昵称、头像、QQ秀等等...)...
  2. python 打包命令以及使用方法
  3. icare3.0医用his软件部署基本流程
  4. 黑客逆向破解基础-3:如何识别程序加的什么壳
  5. log4j2日志输出到控制台-Maven工程
  6. uva :10123 - No Tipping(dfs + 几何力距 )
  7. 利用Photoshop通道制作BMP格式的透明图标
  8. 计算摄影:噪声模型与噪声估计
  9. 多张照片怎么添加时间水印
  10. 什么是大数据思维,数据思维划分哪几个维度?