01背包问题、完全背包、多重背包、恰好装满
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背包问题、完全背包、多重背包、恰好装满相关推荐
- 动态规划总结(01背包 完全背包 多重背包)
动态规划总结(01背包 完全背包 多重背包) 一.学习资料 1.UVA DP 入门专题 2.夜深人静写算法(二) - 动态规划 3.算法之动态规划 4.什么是动态规划?动态规划的意义是什么? 5.01 ...
- 经典背包问题 01背包+完全背包+多重背包
01 背包 有n 种不同的物品,每个物品有两个属性,size 体积,value 价值,现在给一个容量为 w 的背包,问最多可带走多少价值的物品. int f[w+1]; //f[x] 表示背包容量为x ...
- 动态规划之背包问题---01背包---完全背包---多重背包
本篇博客是基于Carl大佬的刷题笔记 (代码随想录) 进行总结的 另外加入了我自己的一些整理,特此记录,以防遗忘 几种在面试中常见的背包,其关系如下: 通过这个图,可以很清晰分清这几种常见背包之间的关 ...
- 完全背包问题+01背包问题+分组背包+多重背包 总结
背包问题都涉及到动态规划,利用dp进行更加优化的计算. 一.01背包 最基本的是01背包问题,题目一般类似:"在一定数目物品内,挑选总重量不超过一定数目的物品,其中每个物品只能选一次,求背包 ...
- 背包问题——01背包/完全背包/多重背包
背包问题是典型的动态规划问题,本文将对典型的背包问题进行总结. 0-1背包问题 有 N 件物品和一个容量是 V 的背包.每件物品只能使用一次. 第 i 件物品的体积是 vi,价值是 wi. 求解将哪些 ...
- 【python】一篇讲透背包问题(01背包 完全背包 多重背包 二维费用背包)
面对背包问题,有一个很重要的方程式:状态转移方程式 所以每一种背包问题我都会给出状态转移方程式 #01背包 什么是01背包型问题? 先给大家感受一下01背包型问题: 给定n种物品和一背包.物品i的重量 ...
- 动态规划 4、基础背包问题总结(多重背包与多重背包的转化)
描述: 有N种物品和一个容量为V的背包.第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. 变式:有的物品 ...
- 背包——多重背包(hdu2191)
首先,如果对01背包不理解的同学请移步 http://blog.csdn.net/sm9sun/article/details/53235986 理解了01背包之后,我们来说明一下多重背包,多重背包 ...
- 洛谷P2851 [USACO06DEC]最少的硬币The Fewest Coins(完全背包+多重背包)
题目描述 Farmer John has gone to town to buy some farm supplies. Being a very efficient man, he always p ...
- POJ 3260 The Fewest Coins 最少硬币个数(完全背包+多重背包,混合型)
题意:FJ身上有各种硬币,但是要买m元的东西,想用最少的硬币个数去买,且找回的硬币数量也是最少(老板会按照最少的量自动找钱),即掏出的硬币和收到的硬币个数最少. 思路:老板会自动找钱,且按最少的找,硬 ...
最新文章
- 使用office生成PDF文件
- 最佳实践 | 中文文案排版指北
- 多快好省的目标检测器来了,旷视孙剑团队提出Anchor DETR:基于Anchor Point的DETR
- linux / 命令行 / LD_DEBUG 命令
- 【JSON】FastJson 打印输格式化输出
- 挑战 Oracle 的全球首个 AI 原生数据库 GaussDB,华为将开源
- Cron, PAM, OpenDNS 介绍
- mysql 索引优化分析
- 不能注册 DLL/OCX:Regsvr32失败的解决办法
- STM32串口通信 中断配置
- PhpSpreadsheet 设置常用格式
- 本科生计算机论文中文核心,本科计算机想投中文核心,求推荐刊物!
- 正态总体参数的假设检验
- 如何锻炼自己的逻辑思维
- 为什么128KB的魂斗罗可以塞下这么长的剧情?
- 数字万用表数字多用表软件下载安装教程
- 头条小程序,小游戏头像授权报错
- 夏日闪电惊雷想念父亲
- 如何将macbook触摸板和外接鼠标的滚轮设置相反方向
- 【附源码】计算机毕业设计java在线学习系统设计与实现