完全背包问题(模板)
有 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
思路:
完全背包:
朴素写法:
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. 最长公 ...
最新文章
- 教育培训行业如何在抖音快速获客、变现?
- SAMBA配置文件所用到的参数
- Xcode(7.0以上版本)真机调试
- 罗斯蒙特电磁流量计8723说明书_罗斯蒙特8732EM电磁流量计变送器如何接线!
- 数智化时代合格数据架构师如何养成?
- P1377 [TJOI2011]树的序 笛卡尔树优化建树
- 从淘宝CFO到接棒马云 张勇是如何在12年里成为阿里董事局主席的
- 浙大计算机基础知识2,[精选资料]14年浙大远程计算机基础2Windows知识题高起专 作业题2答案...
- 大专生自学web前端到找到工作的经验
- SQL建表语句转换为Excel表格
- 用matlab指数传递函数nyquist,用MATLAB制Nyquist图.ppt
- AE 或PR等软件载入素材时,无法访问网络驱动器资源的问题
- 【PTA】到底是不是太胖了
- 最简单的基于FFmpeg的推流器(以推送RTMP为例)
- 混合云风头正劲 青云QingCloud为何成为领导者?
- 无法打开安装程序包....确认这是一个有效的windows installer程序包
- iphone的图书iBooks如何设置垂直滚动看书
- linux pjsip 编译_Linux下移植pjsip使用QT开发
- UE4引擎之Commandlet命令
- 一位平安集团16年老员工:怕你胸有鸿鹄之志,手无缚鸡之力