动态规划01背包2
2013-02-18 17:07 Dr.Ray 阅读(178) 评论(0) 收藏 举报例题8:
给定最大时间,要求采药总价值最大。
输入:第一行两个数据,time给定时间,n药材种类数,之后n行,t[i]采这株药的时间,w[i]这株药的价值。
输出:可采的最大总价值。
例题9:
给定最大金额,要求sum:v[i]*w[i];最大
输入:
第一行:N最大金额,m物品数量,后M行:v[i],w[i]
输出:最大的sum
这类题和经典背包问题差不多,关键在于opt此时不仅是判断能否装满背包的状态,还是储存当前的总价值或者sum 的状态。
要注意金额或者时间是会重复的,于是opt要储存当前最大的总价值或者sum。
下面以例题8为例
一开始我想再用另一个数组tot储存总价值,opt仅仅用来判定是否能装满,然后把tot在v[i](即只用采一株处)初始化为w[i](只用采一株状态函数值),再用递推出多株药情况。但是出现了一个问题,如果多个药的时间有重复,那么初始化tot时就只能表示一种药,即使tot表示最优的药,也是错误的,可能多种药种都在最优解里啊!最后看源码才改用opt。用opt后就很简单了,其他和01背包一样。