[洛谷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(美国航空航天局)因为航天飞机的隔热瓦等其他安 全技术问题一直大伤脑筋,因此在各方压力下终止了航天 飞机的历史,但是此类事情会不会在以后发生,谁也无法 保证,在遇到这类航天问题时,解决方 ...
随机推荐
- 网站app原型设计工具:axure,Mockups,墨刀
网站app原型设计工具:axure,Mockups,墨刀 Balsamiq Mockups 3 网站原型设计工具非常高效,非常简单,几分钟就能搞定比axure好用很多 墨刀 - 免费的移动应用原型与线 ...
- JWT(Json web token)认证详解
JWT(Json web token)认证详解 什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该to ...
- "1130-host ... is not allowed to connect to this MySql server"登录失败
原因: 该用户没有远程连接权限. 解决:授权! mysql>GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' IDENTIFIED BY 'password' ...
- Codeforces Round#413 Problem A - C
Problem#A Carrot Cakes vjudge链接[here] (偷个懒,cf链接就不给了) 题目大意是说,烤面包,给出一段时间内可以考的面包数,建第二个炉子的时间,需要达到的面包数,问建 ...
- noip 2014 提高组 Day 2
1.无线网络发射器选址 这道题数据范围很小,就直接暴力枚举就好了.为了提高速度,就从每个有公共场所的点枚举周围在(x,y)放无线网路发射器可以增加的公共场所数量,加到一个数组里.所有公共场所都处理完了 ...
- HDU 1686 Oulipo(KMP)题解
题意:主串中能找到几个模式串 思路:超详细解释KMP KMP:针对这个代码,解释一下Fail数组的含义:T为主串,P为模式串,Fail代表失配值,即当P[j] != T[i]时,j要指向的位置为Fai ...
- 抽象类的继承,接口的实现,接口类型数组的使用,根据instanceof判断(返回)是否该是哪一个类型,类型的强转.
总觉得之前第2处有点问题,果然. 还需要instanceof判定一下,然后还需要把数组Animal[]转为Pet的才有方法play()~~~!
- Win7上安装WMware虚拟机和Ubuntu操作系统
效果图: 问题拾遗: 一.如何划分一个新硬盘空间? 参考链接:如何新建磁盘空间 效果图: 我划分了20G的内存空间给Ubuntu的硬盘空间.一般来说15G就够用了. 二.VMware上拷贝Ubuntu ...
- POJ 3164 Command Network(最小树形图模板题+详解)
http://poj.org/problem?id=3164 题意: 求最小树形图. 思路: 套模板. 引用一下来自大神博客的讲解:http://www.cnblogs.com/acjiumeng/p ...
- UVa 10905 孩子们的游戏
https://vjudge.net/problem/UVA-10905 题意: 给定n个正整数,把它们连接成一个最大的整数. 思路: 实在是没想到直接用string来排序了. #include< ...