这是一道典型的完全背包题目
先上题目···于是又要迎来洛谷那令人不知道说什么的霸气摘要···
本题地址: http://www.luogu.org/problem/show?pid=1616
输入第一行有两个整数T(1 <= T <= 100000)和M(1 <= M <= 10000),用一个空格隔开,T代表总共能够用来采药的时间,M代表山洞里的草药的数目。接下来的M行每行包括两个在1到10000之间(包括1和10000)的整数,分别表示采摘某种草药的时间和这种草药的价值。
输出格式:输出一行,这一行只包含一个整数,表示在规定的时间内,可以采到的草药的最大总价值。
70 3 71 100 69 1 1 2输出样例#1:
140
完全背包问题(物体可以选无限件)解决方案:
for (int i=1;i<=m;i++) { for (int j=v[i];j<=t;j++) { f[j]=max(f[j],f[j-v[i]]+c[i]); } }
for (int i=1;i<=n;i++) { for (int j=v;j>=a[i];j--) { f[j]=max(f[j],f[j-a[i]]+a[i]); } }
对于完全背包问题的常数优化,可以用“一种简单有效的优化”,就是把价值低于某物品且体积高于某物品的物品删去。背包九讲中提到可以用O(n2)或者O(V+N)的方案实现,但我并不明白具体如何实现,是将该物品对应的两个数组元素赋值为0或某个值,还是怎么样?
无论如何,先把代码放上来吧
——浮天水送无穷树,带雨云埋一半山
版权声明:转载请注明出处 [ametake版权所有]http://blog.csdn.net/ametake欢迎来看
【日常学习】【背包DP(完全背包)】洛谷1616 疯狂的采药题解
原文地址:http://blog.csdn.net/ametake/article/details/47373693