代码改变世界

动态规划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背包一样。