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];
}

后记

到这里,题已经做出来了。通过这两天刷的这些题,大家应该找到了背包问题的通解。在这里总结一下。

  1. 01背包 一个物品只能选一次 \(dp[i]=max(dp[i],dp[i-m[k]]+v[k])\ i=c...m[k]\ O(nc)\)
  2. 完全背包 一个物品可以选无限次 \(dp[i]=max(dp[i],dp[i-m[k]]+v[k])\ i=m[k]...c\ O(nc)\)
  3. 多维背包 有多个限制 \(dp[i1]...[in]=max(dp[i1]...[in],dp[i1-m1[k]]...[in-mn[k]]+v[k])\ O(nc1...cn)\)
  4. 多重背包 一个物品只能选有限次 可以把一个物品分解为多个同样属性的物品,然后用01背包求解\(O(\sum times[i]\ *c)\)(再难一点的做法是二进制优化\(O(\sum log_2times[i]\ *c)\),甚至单调队列\(O(nc)\))
  5. 超大背包 限制特别大,但是每个物品价值较低 \(dp[i]=min(dp[i],dp[i-v[k]]+m[k])\)其中\(dp[i]\)表示达到价值i时的最小质量

[洛谷P1507]NASA的食物计划 以及 对背包问题的整理的更多相关文章

  1. 洛谷 P1507 NASA的食物计划 【二维费用背包】 || 【DFS】

    题目链接:https://www.luogu.org/problemnew/show/P1507 题目背景 NASA(美国航空航天局)因为航天飞机的隔热瓦等其他安全技术问题一直大伤脑筋,因此在各方压力 ...

  2. 【洛谷P1507 NASA的食物计划】

    题目背景 NASA(美国航空航天局)因为航天飞机的隔热瓦等其他安全技术问题一直大伤脑筋,因此在各方压力下终止了航天飞机的历史,但是此类事情会不会在以后发生,谁也无法保证,在遇到这类航天问题时,解决方法 ...

  3. 洛谷 P1507 NASA的食物计划

    题目背景 NASA(美国航空航天局)因为航天飞机的隔热瓦等其他安 全技术问题一直大伤脑筋,因此在各方压力下终止了航天 飞机的历史,但是此类事情会不会在以后发生,谁也无法 保证,在遇到这类航天问题时,解 ...

  4. 洛谷——P1507 NASA的食物计划

    https://www.luogu.org/problem/show?pid=1507#sub 题目背景 NASA(美国航空航天局)因为航天飞机的隔热瓦等其他安 全技术问题一直大伤脑筋,因此在各方压力 ...

  5. 洛谷P1507 NASA的食物计划

    //二维费用背包 #include<bits/stdc++.h> using namespace std; ; ; ; int v1[maxn],v2[maxn],w[maxn],n,v1 ...

  6. 【洛谷P1507 NASA的食物计划】动态规划

    分析 二维费用背包模板 AC代码 #include <bits/stdc++.h> using namespace std; const int Maxn=505; int a[Maxn] ...

  7. P1507 NASA的食物计划

    传送 01背包又进化了,它变成了二维背包. 既然它多了一个维度,那么我们的f[j]也变成了二维数组f[i][j],其中i表示费用1,j表示费用2 核心方程也相应的变成了f[i][j]=max(f[i- ...

  8. 【洛谷p1507】NASA的食物计划

    (一次a……) NASA的食物计划[传送门] 好的上算法标签: 嗯这是个二维背包 (万年不变分隔线) 二维的题就是在一维基础上增加了一个条件,这个背包不仅含有质量还有体积.所以我们增加一层循环.核心算 ...

  9. vijos1334 NASA的食物计划(二维费用的背包问题)

    背景 NASA(美国航空航天局)因为航天飞机的隔热瓦等其他安 全技术问题一直大伤脑筋,因此在各方压力下终止了航天 飞机的历史,但是此类事情会不会在以后发生,谁也无法 保证,在遇到这类航天问题时,解决方 ...

随机推荐

  1. LINUX环境变量(二)

    一.Shell变量分为本地变量和环境变量. 1.本地变量:在用户现有运行的脚本中使用 a) 定义本地变量 格式: variable-name=value b) 显示本地变量 格式: set  c) 清 ...

  2. Android :64位支持的说明

    https://blog.csdn.net/u012400885/article/details/52923765 https://blog.csdn.net/ouyang_peng/article/ ...

  3. python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍

    python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍 IDLE默认不能显示行号,使用ALT+G 跳到对应行号,在右下角有显示光标所在行.列.pycharm免费社区版.Su ...

  4. php 获取随机数的几个方式

    php 获取随机数的几个方式 1.直接获取从min-max的数,例如1-20:$randnum = mt_rand(1, 20); 2.在一个数组里面随机选择一个(验证码的时候需要字母.数字混合的情况 ...

  5. 通过Jenkins + Docker实现antdPro自动化推送私服、自动容器化部署功能

    Docker与Docker私服 1. 安装docker https://docs.docker.com/install/ 2. 配置docker镜像加速 https://www.daocloud.io ...

  6. scrapy运行方式

    1,在cmd 命令行下执行 scrapy crawl  demo (爬虫主逻辑的 name= 'demo '的名字) 2, 也可以在spider目录下添加一个py文件,加入以下代码 from scra ...

  7. 20145220韩旭飞《网络对抗》Exp8 Web基础

    20145220韩旭飞<网络对抗>Exp8 Web基础 Web前端:HTML基础 首先,我们的Web开发是基于Apache服务器进行的,所以对于Apache的基本操作我们是应该要掌握的,对 ...

  8. STM32串口中断

    在打开串口1中断后 待机唤醒功能,(PA0唤醒)等 系统挺运行问题? ??(2014.11.13)

  9. Vue 动态图片加载路径问题和解决方法

    最近在做一个树形结构的组件,使用了Vue和element UI中el-tree组件.因为树中每个节点都需要显示一个图标图片,并且需要根据后台传入的数据类型动态地显示,所以图片的路径需要动态地加载.下面 ...

  10. Python3基础 str format 四舍六入五凑偶 保留一位小数

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...