01背包问题:最基本的背包问题,每个物品最多只能放一次。

完全背包问题:每种物品可以放无限多次。

多重背包问题:每种物品有一个固定的次数上限。

【代码】

import java.util.Scanner;
public class 三种背包问题 {static final boolean isFullPack=false;//题目是否要求恰好装满 public static void main(String[] args) {//输入Scanner scanner=new Scanner(System.in);int V=scanner.nextInt();int N=scanner.nextInt();int value[]=new int[N+1];int weight[]=new int[N+1];int num[]=new int[N+1];for(int i=1;i<=N;i++) {num[i]=scanner.nextInt();weight[i]=scanner.nextInt();value[i]=scanner.nextInt();}//结果System.out.println(manyPack2( N, V, weight, value,num));}/*** @param N 物品种类数* @param V 背包容量* @param weight[]物品重量* @param value[]物品价值* @return*///01背包static int zeroOnePack(int N,int V,int weight[],int value[]) {int dp[][]=new int[N+1][V+1];//dp[i][v]表示只考虑前i个物品、背包容量为v时的最大价值for(int i=1;i<=N;i++) {/*注释掉的代码已被优化for(int v=1;v<=V;v++) {if(weight[i]>v) {dp[i][v]=dp[i-1][v];}else {dp[i][v]=Math.max(dp[i-1][v], dp[i-1][v-weight[i]]+value[i]);}}*/for(int v=weight[i];v<=V;v++) {dp[i][v]=Math.max(dp[i-1][v], dp[i-1][v-weight[i]]+value[i]);}}int maxvalue= dp[N][V];//输出选择的物品int v=V;String choseRes="";for(int i=N;i>0;i--){//若果dp[i][v]>dp[i-1][v],这说明第i件物品是放入背包的if(dp[i][v]>dp[i-1][v]){choseRes = i+" "+choseRes;v=v-weight[i];}if(v==0)break;}System.out.println(choseRes);return maxvalue;}//01背包空间压缩成On 必会static int zeroOnePack2(int N,int V,int weight[],int value[]) {int dp[]=new int[V+1];//dp[v]背包容量为v时的最大价值//如果题目要求恰好装满,只需初始化dp[0]=0,dp[1~N]=负无穷。最终dp[N]<0代表无解if(isFullPack==true) {dp[0]=0;for(int i=1;i<=N;i++) {dp[i]=Integer.MIN_VALUE;}}for(int i=1;i<=N;i++) {//倒序遍历以保证dp[v-weight[i]]相当于dp[i-1][v-weight[i]]for(int v=V;v>=weight[i];v--) {//注意v>=weight[i],否则越界dp[v]=Math.max(dp[v], dp[v-weight[i]]+value[i]);}}return dp[V];}//完全背包  必会static int completePack(int N,int V,int weight[],int value[]) {int dp[]=new int[V+1];//dp[v]背包容量为v时的最大价值//如果题目要求恰好装满,只需初始化dp[0]=0,dp[1~N]=负无穷。最终dp[N]<0代表无解if(isFullPack==true) {dp[0]=0;for(int i=1;i<=N;i++) {dp[i]=Integer.MIN_VALUE;}}for(int i=1;i<=N;i++) {//“加选一件第 i 种物品”,正需要一个可能已选入第 i种物品的子结果 F[i,v-wi],必须采用 v递增的顺序循环for(int v=weight[i];v<=V;v++) {//注意初始v=weight[i],否则越界dp[v]=Math.max(dp[v], dp[v-weight[i]]+value[i]);}}return dp[V];}//多重背包static long manyPack(int N,int V,int weight[],int value[],int num[]) {//通过80%,超时long dp[][]=new long[N+1][V+1];for(int i=1;i<=N;i++) {for(int j=1;j<=V;j++) {//如果第i件物品的重量大于背包容量j,则不装入背包if(weight[i] > j)dp[i][j] = dp[i-1][j];else{//考虑物品的件数限制int maxNum = Math.min(num[i],j/weight[i]);for(int k=0;k<=maxNum;k++){dp[i][j]=Math.max(dp[i][j],Math.max(dp[i-1][j],dp[i-1][j-k*weight[i]]+k*value[i]));}}}}long maxvalue= dp[N][V];return maxvalue;}//多重背包转01背包  必会static long manyPack2(int N,int V,int weight[],int value[],int num[]) {int dp[]=new int[V+1];//如果题目要求恰好装满,只需初始化dp[0]=0,dp[1~N]=负无穷。最终dp[N]<0代表无解if(isFullPack==true) {dp[0]=0;for(int i=1;i<=N;i++) {dp[i]=Integer.MIN_VALUE;}}for(int i=1;i<=N;i++) {int numLast=Math.min(num[i], V/num[i]);for(int numk=1;numLast>0;numk<<=1) {if(numk>numLast) {numk=numLast;}numLast-=numk;//转01背包,需要逆序。倒序遍历以保证dp[v-weight[i]]相当于dp[i-1][v-weight[i]]for(int v=V;v>=weight[i]*numk;v--) {dp[v]=Math.max(dp[v], dp[v-weight[i]*numk]+value[i]*numk);}}}return dp[V];}
}

01背包问题、完全背包、多重背包、恰好装满相关推荐

  1. 动态规划总结(01背包 完全背包 多重背包)

    动态规划总结(01背包 完全背包 多重背包) 一.学习资料 1.UVA DP 入门专题 2.夜深人静写算法(二) - 动态规划 3.算法之动态规划 4.什么是动态规划?动态规划的意义是什么? 5.01 ...

  2. 经典背包问题 01背包+完全背包+多重背包

    01 背包 有n 种不同的物品,每个物品有两个属性,size 体积,value 价值,现在给一个容量为 w 的背包,问最多可带走多少价值的物品. int f[w+1]; //f[x] 表示背包容量为x ...

  3. 动态规划之背包问题---01背包---完全背包---多重背包

    本篇博客是基于Carl大佬的刷题笔记 (代码随想录) 进行总结的 另外加入了我自己的一些整理,特此记录,以防遗忘 几种在面试中常见的背包,其关系如下: 通过这个图,可以很清晰分清这几种常见背包之间的关 ...

  4. 完全背包问题+01背包问题+分组背包+多重背包 总结

    背包问题都涉及到动态规划,利用dp进行更加优化的计算. 一.01背包 最基本的是01背包问题,题目一般类似:"在一定数目物品内,挑选总重量不超过一定数目的物品,其中每个物品只能选一次,求背包 ...

  5. 背包问题——01背包/完全背包/多重背包

    背包问题是典型的动态规划问题,本文将对典型的背包问题进行总结. 0-1背包问题 有 N 件物品和一个容量是 V 的背包.每件物品只能使用一次. 第 i 件物品的体积是 vi,价值是 wi. 求解将哪些 ...

  6. 【python】一篇讲透背包问题(01背包 完全背包 多重背包 二维费用背包)

    面对背包问题,有一个很重要的方程式:状态转移方程式 所以每一种背包问题我都会给出状态转移方程式 #01背包 什么是01背包型问题? 先给大家感受一下01背包型问题: 给定n种物品和一背包.物品i的重量 ...

  7. 动态规划 4、基础背包问题总结(多重背包与多重背包的转化)

    描述: 有N种物品和一个容量为V的背包.第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. 变式:有的物品 ...

  8. 背包——多重背包(hdu2191)

    首先,如果对01背包不理解的同学请移步  http://blog.csdn.net/sm9sun/article/details/53235986 理解了01背包之后,我们来说明一下多重背包,多重背包 ...

  9. 洛谷P2851 [USACO06DEC]最少的硬币The Fewest Coins(完全背包+多重背包)

    题目描述 Farmer John has gone to town to buy some farm supplies. Being a very efficient man, he always p ...

  10. POJ 3260 The Fewest Coins 最少硬币个数(完全背包+多重背包,混合型)

    题意:FJ身上有各种硬币,但是要买m元的东西,想用最少的硬币个数去买,且找回的硬币数量也是最少(老板会按照最少的量自动找钱),即掏出的硬币和收到的硬币个数最少. 思路:老板会自动找钱,且按最少的找,硬 ...

最新文章

  1. 使用office生成PDF文件
  2. 最佳实践 | 中文文案排版指北
  3. 多快好省的目标检测器来了,旷视孙剑团队提出Anchor DETR:基于Anchor Point的DETR
  4. linux / 命令行 / LD_DEBUG 命令
  5. 【JSON】FastJson 打印输格式化输出
  6. 挑战 Oracle 的全球首个 AI 原生数据库 GaussDB,华为将开源
  7. Cron, PAM, OpenDNS 介绍
  8. mysql 索引优化分析
  9. 不能注册 DLL/OCX:Regsvr32失败的解决办法
  10. STM32串口通信 中断配置
  11. PhpSpreadsheet 设置常用格式
  12. 本科生计算机论文中文核心,本科计算机想投中文核心,求推荐刊物!
  13. 正态总体参数的假设检验
  14. 如何锻炼自己的逻辑思维
  15. 为什么128KB的魂斗罗可以塞下这么长的剧情?
  16. 数字万用表数字多用表软件下载安装教程
  17. 头条小程序,小游戏头像授权报错
  18. 夏日闪电惊雷想念父亲
  19. 如何将macbook触摸板和外接鼠标的滚轮设置相反方向
  20. 【附源码】计算机毕业设计java在线学习系统设计与实现

热门文章

  1. c语言循环最大数while,C语言while循环
  2. 【Flask】Flask框架简介
  3. NetDrive软件的设计架构
  4. linux打开.db文件,DB_ 文件扩展名: 它是什么以及如何打开它?
  5. psAI功能安装使用
  6. 领导自己——摘抄,有删节
  7. 第18章 请勿陷入对技术的狂热之中
  8. Aspnet core迁移 wwwroot静态文件文件
  9. [sd card] SD card初始化时的总线设置
  10. Python到底是什么?现在为什么折磨火?