luoguP1064 金明的预算方案 (有依赖的背包问题)
题目链接:https://www.luogu.org/problemnew/show/P1064
这是一个有依赖的背包问题,属于01背包的变式。这题还好,每个主件最多有2个附件,那么在对主件进行背包的时候,决策就不再是两个,而是五个。
01背包的决策:
- 不选;
- 选;
这个题目的决策:
- 不选;
- 只选主件;
- 选主件和附件1;
- 选主件和附件2;
- 选主件,附件1和附件2;
这里需要先判断选附件的决策是不是可行,即如果当前容量能放下附件1或附件2或附件1和附件2,才考虑状态转移。
因此这题的状态转移方程有4个:
f[j]=max(f[j],f[j-mv[i]]+mc[i]);
f[j]=max(f[j],f[j-mv[i]-av[i][1]]+mc[i]+ac[i][1]);
f[j]=max(f[j],f[j-mv[i]-av[i][2]]+mc[i]+ac[i][2]);
f[j]=max(f[j],f[j-mv[i]-av[i][1]-av[i][2]]+mc[i]+ac[i][1]+ac[i][2]);
其中mv表示主件的费用数组,mc表示主件的价值(费用×重要度)数组,av表示附件的费用数组,ac表示附件的价值数组。
av[i][0]表示主件i的附件个数,av[i][1/2]表示主件i的附件1/2的费用,ac[i][1/2]表示主件i的附件1/2的价值。
AC代码如下:
#include<cstdio>
#include<algorithm>
using namespace std; int n,m;
int mv[],mc[],av[][],ac[][];
int f[]; int main(){
scanf("%d%d",&n,&m);
int v,p,q;
for(int i=;i<=m;i++){
scanf("%d%d%d",&v,&p,&q);
if(!q){
mv[i]=v;
mc[i]=v*p;
}
else{
av[q][]++;
av[q][av[q][]]=v;
ac[q][av[q][]]=v*p;
}
}
for(int i=;i<=m;i++)
if(mv[i]){
for(int j=n;j>=mv[i];j--){
f[j]=max(f[j],f[j-mv[i]]+mc[i]);
if(j>=mv[i]+av[i][])
f[j]=max(f[j],f[j-mv[i]-av[i][]]+mc[i]+ac[i][]);
if(j>=mv[i]+av[i][])
f[j]=max(f[j],f[j-mv[i]-av[i][]]+mc[i]+ac[i][]);
if(j>=mv[i]+av[i][]+av[i][])
f[j]=max(f[j],f[j-mv[i]-av[i][]-av[i][]]+mc[i]+ac[i][]+ac[i][]);
}
}
printf("%d\n",f[n]);
return ;
}
luoguP1064 金明的预算方案 (有依赖的背包问题)的更多相关文章
- 洛谷 P1064 金明的预算方案(有依赖的背包问题)
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”.今 ...
- 洛谷 P1064 金明的预算方案 (有依赖的0/1背包)
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NN元钱就行”. ...
- 【洛谷P1064】[NOIP2006] 金明的预算方案
金明的预算方案 显然是个背包问题 把每个主件和它对应的附件放在一组,枚举每一组,有以下几种选法: 1.都不选 2.只选主件 3.一个主件+一个附件 4.一个主件+两个附件 于是就成了01背包.. #i ...
- 有依赖的背包---P1064 金明的预算方案
P1064 金明的预算方案 solution 1 暴搜 70pt dfs (当前搜到了第几个物品,产生的总价值,剩下多少钱) 剪枝 1:如果剩下的钱数<0,直接return就好,没必要继续了 剪 ...
- [LuoguP1064][Noip2006]金明的预算方案
金明的预算方案(Link) 题目描述 现在有\(M\)个物品,每一个物品有一个钱数和重要度,并且有一个\(Q\),如果\(Q = 0\),那么该物件可以单独购买,当\(Q != 0\)时,表示若要购买 ...
- 「NOIP2006」「LuoguP1064」 金明的预算方案(分组背包
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NNN元钱就行” ...
- [codevs1155][KOJ0558][COJ0178][NOIP2006]金明的预算方案
[codevs1155][KOJ0558][COJ0178][NOIP2006]金明的预算方案 试题描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴 ...
- Luogu 1064 金明的预算方案 / CJOJ 1352 [NOIP2006] 金明的预算方案(动态规划)
Luogu 1064 金明的预算方案 / CJOJ 1352 [NOIP2006] 金明的预算方案(动态规划) Description 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己 ...
- 背包形动态规划 fjutoj2375 金明的预算方案
金明的预算方案 TimeLimit:1000MS MemoryLimit:128MB 64-bit integer IO format:%lld Problem Description 金明今天 ...
随机推荐
- 本地ip 和 网络ip 解释
本地IP其实就是私有IP地址10.0.0.0--10.255.255.255172.16.0.0----172.31.255.255192.168.0.0---192.168.255.255 这些都是 ...
- SpringMVC中的重定向和转发的实现
1.请求转发和重定向的区别 请求重定向和请求转发都是web开发中资源跳转的方式. 请求转发是服务器内部的跳转 地址栏比发生变化 只有一个请求相应 可以通过request域对跳转目标的请求 请求重定向是 ...
- [UE4]通过代码改变材质
OrangeMaterial = ConstructorStatics.OrangeMaterial.Get(); , OrangeMaterial); 使用到的结构体如下: struct FCons ...
- win10的坑之wifi找不到
安装了win10一周以来,win10的坑太多太多,微软搞什么pc/mobile二合一,真是脑残行为. 首先是usb设备无缘无故找不到,据说是和杀毒软件/防火墙有关,后来是关掉了windows defe ...
- Spark学习笔记5:Spark集群架构
Spark的一大好处就是可以通过增加机器数量并使用集群模式运行,来扩展计算能力.Spark可以在各种各样的集群管理器(Hadoop YARN , Apache Mesos , 还有Spark自带的独立 ...
- centos 7.x设置守护进程的文件数量限制
在Bash中有个ulimit命令,提供了对Shell及该Shell启动的进程的可用资源控制.主要包括打开文件描述符数量.用户的最大进程数量.coredump文件的大小等. 1. 系统级设置 1.1 C ...
- 使用eclipse在linux下开发C/C++
一直在Linux下开发,苦于没有IDE,一般都是自己编写Makefile,然后在windows下用文本编辑器ftp打开文件编辑,然后在linux下完成编译.调试代码也只能是命令行用gdb进行调试,相当 ...
- 小朋友学C++(2)
多态 (一) 先编写函数: #include <iostream> using namespace std; class Shape { protected: int width, hei ...
- 34. CentOS-6.3安装配置Apache2.2.6
安装说明 安装环境:CentOS-6.3安装方式:源码编译安装 软件:httpd-2.2.6.tar.gz | pcre-8.32.tar.gz | apr-1.4.6.tar.gz | apr-u ...
- SpringMVC + Mybatis 多数据源配置
比较常用的配置,多数据源.主从等等. 大概的逻辑是: 1.spring-mybatis.xml中配置多个数据源 2.使用Spring提供的AbstractRoutingDataSource类来根据请求 ...