完全背包问题(模板)
有 NN 种物品和一个容量是 VV 的背包,每种物品都有无限件可用。
第 ii 种物品的体积是 vivi,价值是 wiwi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。
输入格式
第一行两个整数,N,VN,V,用空格隔开,分别表示物品种数和背包容积。
接下来有 NN 行,每行两个整数 vi,wivi,wi,用空格隔开,分别表示第 ii 种物品的体积和价值。
输出格式
输出一个整数,表示最大价值。
数据范围
0<N,V≤10000<N,V≤1000
0<vi,wi≤10000<vi,wi≤1000
输入样例
4 5
1 2
2 4
3 4
4 5
输出样例:
10
思路:
完全背包:
![](/assets/blank.gif)
朴素写法:
import java.util.Scanner;public class Main {static final int max=1005;static int n,m;static int dp[][]=new int[max][max];static int v[]=new int[max];static int w[]=new int[max];public static void main(String[] args) {Scanner scan=new Scanner(System.in);n=scan.nextInt();m=scan.nextInt();for(int i=1;i<=n;i++){v[i]=scan.nextInt();w[i]=scan.nextInt();}for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){dp[i][j]=dp[i-1][j];for(int k=0;k*v[i]<=j;k++)dp[i][j]=Math.max(dp[i][j], dp[i-1][j-k*v[i]]+k*w[i]);}System.out.println(dp[n][m]);}
}
优化: 三层循环变两层循环
代码:
import java.util.Scanner;public class Main {static final int max=1005;static int n,m;static int dp[][]=new int[max][max];static int v[]=new int[max];static int w[]=new int[max];public static void main(String[] args) {Scanner scan=new Scanner(System.in);n=scan.nextInt();m=scan.nextInt();for(int i=1;i<=n;i++){v[i]=scan.nextInt();w[i]=scan.nextInt();}for(int i=1;i<=n;i++)for(int j=0;j<=m;j++){dp[i][j]=dp[i-1][j];if(v[i]<=j) dp[i][j]=Math.max(dp[i][j], dp[i][j-v[i]]+w[i]);}System.out.println(dp[n][m]);}
}
再进一步优化: 二维变一维
import java.util.Scanner;public class Main {static final int max=1005;static int n,m;static int dp[]=new int[max];static int v[]=new int[max];static int w[]=new int[max];public static void main(String[] args) {Scanner scan=new Scanner(System.in);n=scan.nextInt();m=scan.nextInt();for(int i=1;i<=n;i++){v[i]=scan.nextInt();w[i]=scan.nextInt();}for(int i=1;i<=n;i++)for(int j=v[i];j<=m;j++){dp[j]=Math.max(dp[j], dp[j-v[i]]+w[i]);}System.out.println(dp[m]);}
}
完全背包问题(模板)相关推荐
- ACM模板 | 背包问题模板总结
背包问题 模板 01 背包问题 一维数组(滚动数组)模板 for(int i = 1; i <= m; ++i){ //小于等于总个数,从 1 开始for(int j = T; j >= ...
- [AcWing] 9. 分组背包问题(C++实现)分组背包问题模板题
[AcWing] 9. 分组背包问题(C++实现)分组背包问题模板题 1. 题目 2. 读题(需要重点注意的东西) 3. 解法 4. 可能有帮助的前置习题 5. 所用到的数据结构与算法思想 6. 总结 ...
- 【Leetcode】背包问题模板
https://leetcode-cn.com/problems/combination-sum-iv/solution/xi-wang-yong-yi-chong-gui-lu-gao-ding-b ...
- MangataのACM模板
文章目录 数据结构 并查集 树状数组 二维单点修改,区间查询 二维区间修改,单点查询 二维区间修改,区间查询 线段树 单点修改,区间查询 区间更新.区间查询 主席树(区间第k小数模板) 单调栈 单调队 ...
- 多重背包问题——庆功会
为了庆贺班级在校运动会上取得全校第一名成绩,班主任决定开一场庆功会,为此拨款购买奖品犒劳运动员. 期望拨款金额能购买最大价值的奖品,可以补充他们的精力和体力. 输入格式 第一行二个数n,m,其中n代表 ...
- c++/go算法模板, 刷题记录
◉ 一.数组 912. 排序数组 给你一个整数数组 nums,请你将该数组升序排列. 示例 1: 输入:nums = [5,2,3,1] 输出:[1,2,3,5] 示例 2: 输入:nums = [5 ...
- 一本通 1267:【例9.11】01背包问题
01背包问题 经典的01背包问题模板 这里提供两种做法: #include <iostream> #include <cstdio> using namespace std; ...
- Leetcode动态规划——01背包问题
内容参考 https://blog.csdn.net/yoer77/article/details/70943462 https://labuladong.github.io/ebook/动态规划系列 ...
- 金明的预算方案(洛谷-P1064)
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过 NN ...
- 最全动态规划题型详解
文章目录 前言 数字三角形模型 1. 数字三角形 2. 最低通行费 3. 方格取数 总结 最长上升子序列模型 1. 最长上升子序列(LIS) 2. 怪盗基德的滑翔翼 3. 最长公共子序列 4. 最长公 ...
最新文章
- 微信小程序开发-笔记
- Python--读取csv文件的整列
- python素数判断代码_Python 判断101-200之间有多少个素数,并输出所有素数
- 将一个大文件分成若干个小文件方法
- Akka并发编程——第三节:Actor模型(二)
- mapview Java,Class:android核心类/MapView
- 剑指offer之消息中间件ActiveMQ知识总结
- java swing jcheckbox_Swing JCheckBox类
- ajax的嵌套需要注意的问题
- FPGA实现VGA显示(五)——————配置ROM测试及图片显示(b)
- 菜鸟上网必备知识大全
- 如何去追女生,看了你就成功了一半
- 如何下载安装 Visual Studio2010
- 超定方程组最小二乘matlab,超定方程组最优解(最小二乘解)推导
- 深圳最牛街道办:腾讯华为设总部,百家上市公司年营收超2万亿
- MIUI12系统如何刷入开发版获得ROOT权限
- 杨百翰大学计算机科学专业,杨百翰大学计算机科学硕士.pdf
- OpenCV每日函数 几何图像变换模块 (8) remap函数
- 抗疫先锋 | IBM:同心抗疫,重塑未来 - emerge smarter!
- Android相机开发: 触摸对焦,触摸测光,二指手势缩放
热门文章
- 批量删除新浪微博关注
- WIN7 64位 VS2013下载
- 深度学习在视频行为识别中应用
- CDRX4X5X6X7X8下载安装失败的原因教程分享(CorelDRAW)
- 2017 matlab 仿真,【2017年整理】Simulink仿真教程.ppt
- 计算多条线段总长的lisp程序_CAD二次开发-lisp篇(1)统计长度
- Android 接入阿里云推送com.aliyun.ams:alicloud-android-push:3.7.4步骤(一)
- 三菱plc分拣程序_基于三菱PLC控制的物料分拣系统设计与实现
- Silvaco仿真入门
- 数据结构:图(Graph)【详解】