洛谷 P1064 金明的预算方案(01背包问题)
https://www.cnblogs.com/violet-acmer/p/9852294.html
题解:
这道题是 “01”背包问题的变形。
如果不考虑买附件必须买相应的主件这一条件下,这就是单纯的 “01”背包问题。
那,这道题该如何做呢?
注意看一下题干,每个主件最多有 2 个附件,那这就容易些了,枚举所有的可能;
对于第 i 个主件,有以下五种可能:
(1):不选主件 i
(2):只选主件 i
(3):选主件 i + 附件1
(4):选主件 i + 附件2
(5):选主件 i + 附件1 + 附件2
从这五个中找到最大的价值组合,并和 dp[i-1][ j ]判断,取最大值,当然在选择附件时,需要满足当前价值可以容下所选择的总价值。
AC代码:
#include<iostream>
#include<cstdio>
using namespace std;
#define P pair<int ,int >
const int maxn=3.2e4+; int n,m;
int dp[][maxn];
P mainG[maxn];//存储主件信息
P touchG[][maxn];//touchG[i] : 存储主件 i 含有的附件信息
int total[];//total[i] : 主件 i 含有的附件个数
int Val(P p){
return p.first*p.second;
}
void Solve()
{
for(int i=;i <= m;++i)
{
P one=touchG[i][];
P two=touchG[i][];
for(int j=;j <= n;++j)
{
dp[i][j]=dp[i-][j];
if(j >= mainG[i].first)
dp[i][j]=max(dp[i][j],dp[i-][j-mainG[i].first]+Val(mainG[i]));
if(j >= mainG[i].first+one.first)
dp[i][j]=max(dp[i][j],dp[i-][j-mainG[i].first-one.first]+Val(mainG[i])+Val(one));
if(j >= mainG[i].first+two.first)
dp[i][j]=max(dp[i][j],dp[i-][j-mainG[i].first-two.first]+Val(mainG[i])+Val(two));
if(j >= mainG[i].first+one.first+two.first)
dp[i][j]=max(dp[i][j],dp[i-][j-mainG[i].first-one.first-two.first]+Val(mainG[i])+Val(one)+Val(two));
}
}
printf("%d\n",dp[m][n]);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i <= m;++i)
{
int v,p,q;
scanf("%d%d%d",&v,&p,&q);
if(!q)
mainG[i]=P(v,p);
else
touchG[q][++total[q]]=P(v,p);
}
Solve();
}
二维dp
#include<iostream>
#include<cstdio>
using namespace std;
#define P pair<int ,int >
const int maxn=3.2e4+; int n,m;
int dp[maxn];
P mainG[maxn];//存储主件信息
P touchG[][maxn];//touchG[i] : 存储主件 i 含有的附件信息
int total[];//total[i] : 主件 i 含有的附件个数
int Val(P p){
return p.first*p.second;
}
void Solve()
{
for(int i=;i <= m;++i)
{
P one=touchG[i][];
P two=touchG[i][];
for(int j=n;mainG[i].first != && j >= ;--j)
{
if(j >= mainG[i].first)
dp[j]=max(dp[j],dp[j-mainG[i].first]+Val(mainG[i]));
if(j >= mainG[i].first+one.first)
dp[j]=max(dp[j],dp[j-mainG[i].first-one.first]+Val(mainG[i])+Val(one));
if(j >= mainG[i].first+two.first)
dp[j]=max(dp[j],dp[j-mainG[i].first-two.first]+Val(mainG[i])+Val(two));
if(j >= mainG[i].first+one.first+two.first)
dp[j]=max(dp[j],dp[j-mainG[i].first-one.first-two.first]+Val(mainG[i])+Val(one)+Val(two));
}
}
printf("%d\n",dp[n]);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i <= m;++i)
{
int v,p,q;
scanf("%d%d%d",&v,&p,&q);
if(!q)
mainG[i]=P(v,p);
else
touchG[q][++total[q]]=P(v,p);
}
Solve();
}
一维dp
关于主件编号问题(踩坑了):
m个物品,编号为 1~m,而不是按照主件的个数进行编号。
例如:
(正确编号)(错误编号)
2000 10
500 1 0 1 1
400 4 0 2
300 5 1 3
400 5 1 4
200 5 0 5
500 4 5 6
400 4 0 7
320 2 0 8
410 3 0 9
400 3 5 10
找这个BUG找了好几个小时,mmp,心累啊.................
洛谷 P1064 金明的预算方案(01背包问题)的更多相关文章
- 洛谷P1064 金明的预算方案
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NN元钱就行”. ...
- 洛谷 P1064 金明的预算方案【有依赖的分组背包】
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱 ...
- 洛谷 P1064 金明的预算方案
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”.今 ...
- 洛谷 P1064 金明的预算方案 (有依赖的0/1背包)
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NN元钱就行”. ...
- [NOIP2006] 提高组 洛谷P1064 金明的预算方案
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”.今 ...
- 洛谷 P1064 金明的预算方案(有依赖的背包问题)
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”.今 ...
- 洛谷P1064 金明的预算方案(01背包)
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NNN元钱就行” ...
- Java实现 洛谷 P1064 金明的预算方案
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NN元 ...
- 洛谷 P1064 金明的预算方案【DP/01背包-方案数】
题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家--餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:"随便点". 题目描述 不过ui ...
随机推荐
- 关于Runtime error
别人说的,但我感觉是因为你的操作是不符合语言规定的,让编译器无法识别,运行不出
- Visual Studio2015安装过程以及单元测试
安装环境: 安装版本: Visual Studio2015 安装过程: 因为我是在第一次老师安排的作业的时候感觉VC++6.0不如VS方便所以才装的Visual Studio2015,又安装了点插件, ...
- 《Linux内核设计与实现》读书笔记六
第4章 进程调度35 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统.只有通过调度程序的合理调度,系统资源才能最 ...
- Python学习笔记 -- 第五章
模块 使用模块可以提高了代码的可维护性.其次,编写代码不必从零开始.当一个模块编写完毕,就可以被其他地方引用.我们在编写程序的时候,也经常引用其他模块,包括Python内置的模块和来自第三方的模块: ...
- 《软件工程》小组团队项目-小学生四则运算APP(First Sprint)
<软件工程>团队项目我们小组选择了小学生四则运算APP,在上学期原有的项目基础上进行更新升级.(自我感觉我们团队上学期的小学生四则运算APP是较为成功且实用的,不过这学期学习到了新的知识, ...
- Linux添加目录到环境变量以及添加sublime到环境变量
博主之前有过这种情况,就是在普通用户下su ls等命令还有效,可登陆进root用户之后这些常用的命令竟然失效了. 像这样 这问题其实很简单,但是对于不清楚环境变量的配置的同学来说也的确棘手,我之前就是 ...
- spring-web-4.3.3与spring-webmvc-4.3.3的区别
spring-web-4.3.3 http(http协议的实现类)和web包(应用,上下文,会话,cookies,过滤器等等) spring-webmvc-4.3.3 主要是一些view层的核心封装, ...
- Java-System.getProperty()
Java平台使用了一个Poperties对象来维护其自己的配置信息.System泪中包含有一个Properties对象用于描述当前工作环境的配置.系统properties包含了关于当前用户.当前Jav ...
- asp.net core 2.0中的配置(1)---Configuration
配置就是一个装配数据字典的过程,一个字典也就是一个键值对,所以从配置就是键值对. 在asp.net core中关于配置是由四个基本的类型来支撑的,是①IConfigurationSource②ICon ...
- laravel 共享session问题总结
我现在有一个A系统已经上线了,但是要开始研发另外一个功能,我打算把这个功能独立成一个B系统出来,放在其他域名下面,打算在这个A系统登录后,里面一个连接跳转到B系统,看到一些资料说用到共享Session ...