NOIP 2006 金明的预算方案(洛谷P1064,动态规划递推,01背包变形,滚动数组)
一.题目链接:P1064 金明的预算方案
二.思路
1.一共只有五种情况
@1.不买
@2.只买主件
@3.买主件和附件1(如果不存在附件也要运算,只是这时附件的数据是0,也就是算了对标准的结果也没影响)
@4.买主件和附件2
@5.买主件和两个附件
2.因为要求的是重要度*价格,那么数组就直接存重要度*价格,最后输出f[n]就是答案
附件不一定刚好有两个,可是如果没有的话数组的值是空的,也就好像虚无缥缈的灵魂一样,用了也没关系
3.主件和附件要构建一层联系,一个个输入物品时肯定混杂着主件和附件,那么对于主件数组,如果编号为0就存,编号不为0就让他空着,对于附件数组,就用编号作为下标就好了,这样就在主件和附件中构建一层联系,可以随时通过主件找到所属附件
4.判断各种情况时要考虑能不能执行,也就是剩余金币够不够的问题
5.然后循环的时候用滚动数组优化空间,不懂的可以去了解一下
6.各种情况都比较一次,找出最好的就好了
7.本来存重要度的数组现在存重要度*价格,可以简化代码
三.代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll f[+];
ll main_v[+];//v主件单个价格
ll main_vp[+];//主件单个重要度p*价格v
ll belong_v[+][];//附件价格v
ll belong_vp[+][];//附件重要度p*价格v
int main()
{
std::ios::sync_with_stdio(false);
ll n,m;//n钱,m总数
ll temp_v,temp_p,temp_kind;
cin>>n>>m;
for(ll i=;i<=m;i++)
{
cin>>temp_v>>temp_p>>temp_kind;
if(temp_kind==)//如果编号为0,则是物品
{
main_v[i]=temp_v;
main_vp[i]=temp_v*temp_p;
}
else//如果是附属品
{
belong_v[temp_kind][]++;//判断现在是第几个附件,用belong_v[temp_kind][0]来存
belong_v[ temp_kind ][ belong_v[temp_kind][] ] = temp_v;
belong_vp[ temp_kind ][ belong_v[temp_kind][] ] = temp_v*temp_p;
}
}
for(ll i=;i<=m;i++)
for(ll j=n;j>=main_v[i]&&main_v[i]!=;j--)//如果main_v[i]==0则说明这个位置放的是附件
{//如果没进入这个地方就是什么也没买
f[j]=max(f[j],f[j-main_v[i]]+main_vp[i]);//只买主件或者不买
//接下来不能用else if呀,因为是各种情况中的比较
if(j-main_v[i]-belong_v[i][]>=)//买主件和附件1
f[j]=max(f[j],f[j-main_v[i]-belong_v[i][]] + main_vp[i]+belong_vp[i][]);
if(j-main_v[i]-belong_v[i][]>=)//买主件和附件2
f[j]=max(f[j],f[j-main_v[i]-belong_v[i][]] + main_vp[i]+belong_vp[i][]);
if(j-main_v[i]-belong_v[i][]-belong_v[i][]>=)//买主件和附件1和附件2
f[j]=max(f[j],f[j-main_v[i]-belong_v[i][]-belong_v[i][]] + main_vp[i]+belong_vp[i][]+belong_vp[i][]);
}
cout<<f[n]<<endl;
}
金明的预算方案
四.我没想出来的原因
1.我第一种思路是,标记主件有没有被选,但是在动态规划中标记法是不可行的,而且最好不要回溯
2.我第二种思路是,先判断主件,再判断附件,可是这样没什么实际意义,因为主件会对后面的附件产生后效性
3.我一直的疑惑是:判断主件和附件1都有的时候算一种,那么判断主件和附件2都有的时候,怎么知道主件有没有被买过,其实这里就差一点了,只要再考虑同时被买就好了,因为最多才两个附件,其实这是有暗示的:最多两个附件,两个那么小的数字,只有四种情况,完全可以组合出来
4.看懂思路之后我还是WA了一次,错在细节,就是附件的下标应该用temp_kind而不是i,因为附件的下标是紧跟主件的,也就是他们之间要有一个东西,一条纽带能连接
5.又错了一个细节,就是我写了这样的东西f[j]=f[j-main_v[i]]+main_vp[i]这的意思是能买就一定买,是错的,应该是能买再考虑买不买
NOIP 2006 金明的预算方案(洛谷P1064,动态规划递推,01背包变形,滚动数组)的更多相关文章
- NOIP 2006 金明的预算方案
洛谷 P1064 金明的预算方案 https://www.luogu.org/problem/P1064 JDOJ 1420: [NOIP2006]金明的预算方案 T2 https://neooj.c ...
- 最大子段和(洛谷P1115,动态规划递推)
洛谷题目链接 题目赋值出来格式有问题,所以我就只放题目链接了 下面为ac代码 #include<bits/stdc++.h> #define ll long long using name ...
- P1060 开心的金明(洛谷,动态规划递推,01背包轻微变形题)
题目链接:P1060 开心的金明 基本思路: 基本上和01背包原题一样,不同点在于这里要的是最大重要度*价格总和,我们之前原题是 f[j]=max(f[j],f[j-v[i]]+p[i]); 那么这里 ...
- NOIP 2008 传纸条(洛谷P1006,动态规划递推,滚动数组)
题目链接:P1006 传纸条 PS:伤心,又想不出来,看了大神的题解 AC代码: #include<bits/stdc++.h> #define ll long long using na ...
- P1048 采药(洛谷,动态规划递推,01背包原题)
题目直接放链接 P1048 采药 这题只是01背包+背景故事而已 原题来的 PS:我写了一篇很详细的01背包说明,如果下面ac代码有看不懂的地方可以去看看 对01背包的分析与理解(图文) 下面上ac代 ...
- 【洛谷P1064】[NOIP2006] 金明的预算方案
金明的预算方案 显然是个背包问题 把每个主件和它对应的附件放在一组,枚举每一组,有以下几种选法: 1.都不选 2.只选主件 3.一个主件+一个附件 4.一个主件+两个附件 于是就成了01背包.. #i ...
- 「NOIP2006」「LuoguP1064」 金明的预算方案(分组背包
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NNN元钱就行” ...
- [codevs1155][KOJ0558][COJ0178][NOIP2006]金明的预算方案
[codevs1155][KOJ0558][COJ0178][NOIP2006]金明的预算方案 试题描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴 ...
- NOIP2006 金明的预算方案
1. 金明的预算方案 (budget.pas/c/cpp) [问题描述] 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈 ...
随机推荐
- 【hdu3966】Aragorn's Story
题意:给一棵树,并给定各个点权的值,然后有3种操作:I C1 C2 K: 把C1与C2的路径上的所有点权值加上KD C1 C2 K:把C1与C2的路径上的所有点权值减去KQ C:查询节点编号为C的权值 ...
- 关于spring配置文件中编辑时没有提示信息的问题
spring配置文件头部信息主要是提供一个xml的编写规范作用. 新创建的配置文件引入头部信息后,编辑时没有提示信息,重启elipse即可解决.
- APDU命令的结构和处理【转】
本文转载自:http://blog.csdn.net/yonghenzhita/article/details/36402525 版权声明:本文为博主原创文章,未经博主允许不得转载. 简单说,IFD( ...
- MFC ListControl技巧汇总
转自:http://hi.baidu.com/qi_xian/blog/item/1971aa22da89ada24723e856.html 以下未经说明,listctrl默认view 风格为repo ...
- python-----自动解压并删除zip文件
如何自动解压并删除zip? 如何解压 → 使用内置模块来实现(shutil.unpack_archive) 如何删除zip → 使用内置模块os来实现(os.remove) 如何监测zip的出 ...
- 洛谷 P2312 & bzoj 3751 解方程 —— 取模
题目:https://www.luogu.org/problemnew/show/P2312 https://www.lydsy.com/JudgeOnline/problem.php?id=3751 ...
- uva10870
https://vjudge.net/problem/UVA-10870 裸的矩阵快速幂 注意系数矩阵在前面 因为系数矩阵为d*d 方程矩阵为d * 1 放反了就是d * 1 d * d 不符合矩阵乘 ...
- 15_activity生命周期方法说明
现在是可见并且可以被操作,所以现在是一个前台的Activity. 按一下Home键,它是先onPause然后onStop. 现在它就处于一个Stop停止的状态.停止的状态如果我当前内存够用的情况下,它 ...
- bzoj 2060: [Usaco2010 Nov]Visiting Cows 拜访奶牛【树形dp】
设f[u][0/1]为u这个点不选/选,转移的时候从儿子转移,f[u][1]=sum(f[son][0])+1,f[u][0]=sum(max(f[son][0],f[e[i].to][1])) #i ...
- bzoj1202: [HNOI2005]狡猾的商人(并查集 差分约束)
1202: [HNOI2005]狡猾的商人 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4127 Solved: 1981[Submit][Sta ...