[洛谷P1507]NASA的食物计划 以及 对背包问题的整理
P1507 NASA的食物计划
题面
每个物品有三个属性,“所含卡路里”:价值\(v\),“体积”:限制1\(m_1\),以及“质量”:限制2\(m_2\),在n件物品中选择一部分,使得所选物品价值\(v\)之和最大。
同时要求这些物品的限制1\(m_1\)之和不超过限制1上限\(c_1\),限制2\(m_2\)之和不超过限制2上限\(c_2\)。
格式
输入包括n+2行。
第一行包括两个整数\(c_1,c_2(c_1,c_2<400)\)
第二行包括一个整数\(n(n<50)\)
下面n行,每行包括三个整数\(m_1,m_2,v(m_1,m_2<400,v<500)\)
输出满足条件的最大的\(v\)之和
分析
看题目能大体猜到是一道背包题。但是与背包不一样的是,限制有两个。
类比普通背包问题中一般设\(dp[i]\)表示限制为\(i\)时的最优解,那么我们这里可以设\(dp[i][j]\)表示限制分别为\(i\)和\(j\)时的最优解。
下面考虑转移方程式。由于选择一个物品会将两个限制都减少,所以可以得到转移式为\(dp[i][j]=max(dp[i][j],dp[i-m1[k]][j-m2[k]]+v[k])\)其中k表示考虑第k个物品。
代码
#include<bits/stdc++.h>
using namespace std;
int c1,c2,n;
int m1,m2,v;
int f[402][402];
int main(){
cin>>c1>>c2>>n;
for(int k=1;k<=n;k++){
cin>>m1>>m2>>v;
for(int i=c1;i>=m1;i--)
for(int j=c2;j>=m2;j--){
f[i][j]=max(f[i][j],f[i-m1][j-m2]+v);
}
}
cout<<f[c1][c2];
}
后记
到这里,题已经做出来了。通过这两天刷的这些题,大家应该找到了背包问题的通解。在这里总结一下。
- 01背包 一个物品只能选一次 \(dp[i]=max(dp[i],dp[i-m[k]]+v[k])\ i=c...m[k]\ O(nc)\)
- 完全背包 一个物品可以选无限次 \(dp[i]=max(dp[i],dp[i-m[k]]+v[k])\ i=m[k]...c\ O(nc)\)
- 多维背包 有多个限制 \(dp[i1]...[in]=max(dp[i1]...[in],dp[i1-m1[k]]...[in-mn[k]]+v[k])\ O(nc1...cn)\)
- 多重背包 一个物品只能选有限次 可以把一个物品分解为多个同样属性的物品,然后用01背包求解\(O(\sum times[i]\ *c)\)(再难一点的做法是二进制优化\(O(\sum log_2times[i]\ *c)\),甚至单调队列\(O(nc)\))
- 超大背包 限制特别大,但是每个物品价值较低 \(dp[i]=min(dp[i],dp[i-v[k]]+m[k])\)其中\(dp[i]\)表示达到价值i时的最小质量
[洛谷P1507]NASA的食物计划 以及 对背包问题的整理的更多相关文章
- 洛谷 P1507 NASA的食物计划 【二维费用背包】 || 【DFS】
题目链接:https://www.luogu.org/problemnew/show/P1507 题目背景 NASA(美国航空航天局)因为航天飞机的隔热瓦等其他安全技术问题一直大伤脑筋,因此在各方压力 ...
- 【洛谷P1507 NASA的食物计划】
题目背景 NASA(美国航空航天局)因为航天飞机的隔热瓦等其他安全技术问题一直大伤脑筋,因此在各方压力下终止了航天飞机的历史,但是此类事情会不会在以后发生,谁也无法保证,在遇到这类航天问题时,解决方法 ...
- 洛谷 P1507 NASA的食物计划
题目背景 NASA(美国航空航天局)因为航天飞机的隔热瓦等其他安 全技术问题一直大伤脑筋,因此在各方压力下终止了航天 飞机的历史,但是此类事情会不会在以后发生,谁也无法 保证,在遇到这类航天问题时,解 ...
- 洛谷——P1507 NASA的食物计划
https://www.luogu.org/problem/show?pid=1507#sub 题目背景 NASA(美国航空航天局)因为航天飞机的隔热瓦等其他安 全技术问题一直大伤脑筋,因此在各方压力 ...
- 洛谷P1507 NASA的食物计划
//二维费用背包 #include<bits/stdc++.h> using namespace std; ; ; ; int v1[maxn],v2[maxn],w[maxn],n,v1 ...
- 【洛谷P1507 NASA的食物计划】动态规划
分析 二维费用背包模板 AC代码 #include <bits/stdc++.h> using namespace std; const int Maxn=505; int a[Maxn] ...
- P1507 NASA的食物计划
传送 01背包又进化了,它变成了二维背包. 既然它多了一个维度,那么我们的f[j]也变成了二维数组f[i][j],其中i表示费用1,j表示费用2 核心方程也相应的变成了f[i][j]=max(f[i- ...
- 【洛谷p1507】NASA的食物计划
(一次a……) NASA的食物计划[传送门] 好的上算法标签: 嗯这是个二维背包 (万年不变分隔线) 二维的题就是在一维基础上增加了一个条件,这个背包不仅含有质量还有体积.所以我们增加一层循环.核心算 ...
- vijos1334 NASA的食物计划(二维费用的背包问题)
背景 NASA(美国航空航天局)因为航天飞机的隔热瓦等其他安 全技术问题一直大伤脑筋,因此在各方压力下终止了航天 飞机的历史,但是此类事情会不会在以后发生,谁也无法 保证,在遇到这类航天问题时,解决方 ...
随机推荐
- Hive 中Join的专题---Join详解
1.什么是等值连接? 2.hive转换多表join时,如果每个表在join字句中,使用的都是同一个列,该如何处理? 3.LEFT,RIGHT,FULL OUTER连接的作用是什么? 4.LEFT或RI ...
- 应用程序无法正常启动0xc000007b怎么解决
解决方法两种: 1. 网上搜索中最常见的,缺少DirectX 9 ,去下载一个安上就OK了. 2.第二种情况比较操蛋,其实报的错误应该是:mfc100u.dll丢失 .我在两台电脑上装了相同系统后,台 ...
- chrome谷歌浏览器用这种方式清除缓存比较方便了,必须是调试模式才行
chrome谷歌浏览器用这种方式清除缓存比较方便了 PS:必须是调试模式才行,可以不是手机模式 ,有些低版本浏览器可能没有这个功能. ----------------------------- ...
- Python之路----列表推导式和生成器的表达式
列表推导式 egg_list=['鸡蛋%s'%i for i in range(10)] print(egg_list) 列表推导式 推导过程 egg_list = [] for i in range ...
- 如何用tomcat发布自己的Java项目
如何用tomcat发布自己的Java项目 tomcat是什么?它是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器.我们用Java开发出来的web项目,通过tomcat发布出来,别人就可 ...
- 04: 使用BeautifulSoup封装的xss过滤模块
目录: 1.1 xss攻击简介 1.2 xss攻击解决方法 1.1 xss攻击简介返回顶部 1.简介 1. 跨站脚本(cross site script)为了避免与样式css混淆,所以简称为XSS. ...
- Java 问卷调查
对于我的未来,我打算现在学校好好学习专业知识,打下牢固的知识基础,为以后在工作岗位上能够顺利完成任务而努力. 在我看来,学习是一个接触并了解新事物的过程,掌握和应用这些新知识就是学习的目的.然而我们学 ...
- STM32串口中断
在打开串口1中断后 待机唤醒功能,(PA0唤醒)等 系统挺运行问题? ??(2014.11.13)
- trust zone之我见【转】
本文转载自:https://blog.csdn.net/hovan/article/details/42520879 老板交待任务,这个星期我都在研究trust zone的东东,之前有看过代码,但没有 ...
- Linux命令中:rsync和cp之间的区别
rsync:只拷贝那些更新的文件: cp -u:也可以实现类似效果: 两者都基本可以满足备份的需求: 只是一般情况下,用rsync做这类备份之类的事情,更多见: 在备份的操作中,拷贝,过期文件的删除是 ...