博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P1616 疯狂的采药(洛谷,动态规划递推,完全背包)
阅读量:6721 次
发布时间:2019-06-25

本文共 842 字,大约阅读时间需要 2 分钟。

先上题目链接:

然后放AC代码:

#include
#define ll long longusing namespace std;ll f[100010];ll timee[10010];ll w[10010];int main(){ ll t,m; cin>>t>>m;//t总时间,m总草药 //time时间,w价值 for(ll i=1;i<=m;i++) { scanf("%lld",&timee[i]); scanf("%lld",&w[i]); } for(ll i=1;i<=m;i++) for(ll j=timee[i];j<=t;j++) { f[j]=max(f[j],f[j-timee[i]]+w[i]); } cout<
<
疯狂的采药

然后推荐一道类似的题目:

不同点在与这题是完全背包,采药那题是01背包,

还有就是疯狂的采药数据比较大,建议用滚动数组,如果用二维数组不知道会不会不行,我没试过.

然后讲一下思路:

假定你已经学过滚动数组01背包了,那么这题就很简单了,相对于普通的01背包来说,如果用滚动数组的话,

对于for的第二维也就是代表剩余空间那一维是从大到小遍历的,这样就能防止每个物品放了超过一次以上,

也就是新数据覆盖旧数据后在这次循环中新数据不会被再覆盖,放在实际层面就是一个物品只能被放一次

 

如果现在把for的第二维也就是代表剩余空间那一维是从小到大遍历,那么新数据也可能被覆盖,也就是一个物品放了后还可能接着放,

这样一来就从01背包转移到完全背包了

 

至于能用滚动数组的原因是第i层只和第i-1层有关

 

转载于:https://www.cnblogs.com/zyacmer/p/9987032.html

你可能感兴趣的文章
C语言的关键字
查看>>
喷水装置(一)NYOJ6
查看>>
填充与步幅
查看>>
bzoj 1911 特别行动队
查看>>
关于PHPExcel类占用内存问题
查看>>
hadoop分布式存储(1)-hadoop基础概念
查看>>
Mac svn使用学习-1-简介
查看>>
浅谈IT技术选型和未来技术发展趋势
查看>>
JS怎么创建一个类?
查看>>
I00017 生成9开头的按位递减数
查看>>
CCF201604-1 折点计数(100分)
查看>>
线程和进程的区别以及进程通信方法
查看>>
ArcGIS Server GP服务发布与测试(基础版)
查看>>
使用 asp.net mv4开发企业级办公OA
查看>>
Erlang中带超时的receive
查看>>
面向对象的开发范式
查看>>
poj 2455 Secret Milking Machine
查看>>
SVN:更新、同步与提交 PS:被锁定之解决方法
查看>>
ActiveX(ocx) + DLL(wosa) + JS:实现BS硬件调用框架(一)
查看>>
语言精粹【摘要】
查看>>