Test 6.29 T1 预算方案
问题描述
“我需要你为我制订一个购物的方案。我将要为我的宫殿增置一些家具。有n 种备选家具,家具有主件和附件之分。在购买某个主件的附件之前,我必须先购买其对应的主件。某一主件的附件不会是另一样家具所对应的主件。每一件家具 i 都有自己的价格 x 与重要度 y。要完成这个问题,你需要在 1s 内得出我在花费不超过 m 元的情况下所能得到的家具的价格与重要度乘积的和最大。”CJK 不敢怠慢,立刻开始码代码。
输入格式
第一行两个数,m 和 n,接下来 n 行,第 i 行三个数 x,y,z,分别表示该物品的价格、重要度及它的主件的编号(z 为 0 表示该物品为主件)。
输出格式
每一样购买的家具的价格与重要度的乘积的和。(形如 xiyi+xjyj+......,i、j 为购买的家具的编号)
样例输入输出
样例输入1
1000 5
800 2 0
400 5 1
300 5 1
400 3 0
500 2 0
样例输出1
2200
样例输入2
1000 5
800 2 0
400 5 1
300 5 1
400 3 1
500 2 1
样例输出2
1600
解析
如果不考虑主附件,这就是一个裸的完全背包问题。但是如果选附件就必须选主件,所以我们考虑如何处理依赖关系。我们可以设一个分数组表示选了当前主件后用这个主件的附件跑01背包后的结果。每次DP前,都把之前主数组的结果复制到分数组中,跑完背包后再用分数组去更新主数组。注意,在跑01背包时,由于已经选了当前主件,花费的范围要注意。
代码
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
vector<int> v[62];
int n,m,i,j,k,w[62],c[62],op[62],f[30002],g[30002];
int main()
{
freopen("budget.in","r",stdin);
freopen("budget.out","w",stdout);
cin>>m>>n;
for(i=1;i<=n;i++){
cin>>w[i]>>c[i]>>op[i];
c[i]*=w[i];
if(op[i]) v[op[i]].push_back(i);
}
for(i=1;i<=n;i++){
if(!op[i]){
for(j=w[i];j<=m;j++) g[j]=f[j-w[i]]+c[i];
for(j=0;j<v[i].size();j++){
int x=v[i][j];
for(k=m;k>=w[i]+w[x];k--) g[k]=max(g[k],g[k-w[x]]+c[x]);//在这里注意范围
}
for(j=1;j<=m;j++) f[j]=max(f[j],g[j]);
memset(g,0,sizeof(g));
}
}
cout<<f[m]<<endl;
fclose(stdin);
fclose(stdout);
return 0;
}
总结
没有想到还是因为想的不够细致,没有将DP的约束与状态分开,导致约束失效。
Test 6.29 T1 预算方案的更多相关文章
- [codevs1155][KOJ0558][COJ0178][NOIP2006]金明的预算方案
[codevs1155][KOJ0558][COJ0178][NOIP2006]金明的预算方案 试题描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴 ...
- NOIP2006 金明的预算方案
1. 金明的预算方案 (budget.pas/c/cpp) [问题描述] 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈 ...
- 动态规划(背包问题):HRBUST 1377 金明的预算方案
金明的预算方案 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行 ...
- Luogu 1064 金明的预算方案 / CJOJ 1352 [NOIP2006] 金明的预算方案(动态规划)
Luogu 1064 金明的预算方案 / CJOJ 1352 [NOIP2006] 金明的预算方案(动态规划) Description 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己 ...
- [LuoguP1064][Noip2006]金明的预算方案
金明的预算方案(Link) 题目描述 现在有\(M\)个物品,每一个物品有一个钱数和重要度,并且有一个\(Q\),如果\(Q = 0\),那么该物件可以单独购买,当\(Q != 0\)时,表示若要购买 ...
- 算法笔记_103:蓝桥杯练习 算法提高 金明的预算方案(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些 ...
- tyvj 1057 金明的预算方案 背包dp
P1057 金明的预算方案 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 NOIP2006 提高组 第二道 描述 金明今天很开心,家里购置的新房就要领钥匙了 ...
- 【洛谷P1064】[NOIP2006] 金明的预算方案
金明的预算方案 显然是个背包问题 把每个主件和它对应的附件放在一组,枚举每一组,有以下几种选法: 1.都不选 2.只选主件 3.一个主件+一个附件 4.一个主件+两个附件 于是就成了01背包.. #i ...
- 「NOIP2006」「LuoguP1064」 金明的预算方案(分组背包
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NNN元钱就行” ...
随机推荐
- ps 等程序的选项的三种风格
unix options bsd options gnu long options unix options, which may be grouped and must be preceded by ...
- MySQL-default设置
Both statements insert a value into the phone column, but the first inserts a NULL value and the sec ...
- git全套详细教程
git安装 首先,我们要去git的官网下载一个git安装包,双击到无关紧要的步骤我就不详细描述了,直接介绍我们关键的步骤. 选择git包含的内容和打开方式 选择都很清晰,具体情况我不是很清楚,不过选择 ...
- SpringBoot 集成mongodb(1)单数据源配置
新项目要用到mongodb,于是在个人电脑上的虚拟环境linux上安装了下mongodb,练习熟悉下. 1.虚拟机上启动mongodb. 首先查看虚拟机ip地址,忘了哈~~ 命令行>ifconf ...
- Hadoop实战内容摘记
Hadoop 开源分布式计算平台,前身是:Apache Nutch(爬虫),Lucene(中文搜索引擎)子项目之一. 以Hadoop分布式计算文件系统(Hadoop Distributed File ...
- git_01_上传第一个项目至git
前言 Git是一个开源的分布式版本控制系统,可以有效.高速地处理从小到大的项目版本管理.最近在自己研究自动测试,也准备放到git上管理.由于工作中是在已有的代码库拉取.提交代码.自己想要初次建库上传项 ...
- 应用安全 - 代码审计 -Java
Java %c0%ae 安全模式绕过漏洞 原理 在Java端"%c0%ae"解析为"\uC0AE",最后转义为ASCCII低字符-".".通 ...
- CodeForces.1174D.ArraySplitting.(后缀和数组 + 贪心)
题目链接 参考代码: #include <cstdio> #include <algorithm> using namespace std; typedef long long ...
- 移动端的设备提供了一个事件:orientationChange事件
移动端的设备提供了一个事件:orientationChange事件:https://blog.csdn.net/gong1422425666/article/details/79001836
- 懵圈了,面试官问一个 TCP 连接可发多少个 HTTP 请求?
作者:松若章 https://zhuanlan.zhihu.com/p/61423830 一道经典的面试题是从 URL 在浏览器被被输入到页面展现的过程中发生了什么,大多数回答都是说请求响应之后 DO ...