这道题应该是背包问题里堪称经典的问题了,表示刚开始学DP,这类问题也很快弄懂了。
题目大意是给你一些分组,每组物品放在一个盒子里,每组物品都有几种物品,有自己的价格c和价值v,现在要买一个物品时,要买它对应的盒子,盒子的价格是p,问你花一定的钱最多买到的物品价值是多少。
这类问题要用到两个数组,dp[0][i]表示i块钱可以买到的最大价值,dp[1][i]表示考虑到当前盒子时,i块钱可以买到的最大价值,首先dp[0]置为0,枚举全部的盒子,dp[1]置为-oo表示买不到,更新的转移可以从dp[0]转移也可以从dp[1]转移,从dp[0]转移表示你还没有买盒子,要附加上盒子的价格,dp[1]表示你买过盒子了,就直接转移就可以了,转移方程如下:
注意每次dp[1]的置-oo操作,以及每次枚举完当前盒子后用dp[1]更新dp[0]的值。
我的完整代码: