01背包
01背包问题简单来说,是允许放置是放或者不放这个物品的问题。
状态转移方程
虽然这玩意叫做状态转移方程,但是一直感觉还是属于递推的方式
一般的01背包问题都有如下这个状态转移方程。
f ( i , j ) = max { f ( i − 1 , j ) , f ( i − 1 , j − v ) + w } f(i,j)=\max\{ f(i-1,j),f(i-1,j-v)+w\} f(i,j)=max{
f(i−1,j),f(i−1,j−v)+w}
其中, i i i指的是考虑第 i i i个物品(前面 i − 1 i-1 i−1个物品是不考虑的,默认已经得到了其最优状态), j j j指的是目前的可花费代价,比如容量、剩余零花钱等。
上面那个递推方程总的概况是:如果可以拿按这个物品,是拿了好,还是不拿的好。
但是这个方程只是一个很笼统的概括。具体来说,01背包问题并不总是按那个方程进行的,但是类似的思想是一致的。
一道类似于01背包的问题
这道题不知道哪里来的,在哪里有看过,但是印象很深
大致问题:给定 n n n个正整数和一个 k k k,这 n n n个数中任意选出几个,只需要满足它们的和取模 k k k后的结果为0即可。请求出其中和最大可以为多少。
显然可以考虑01背包的放还是不放的问题。但是在放之前,需要对问题进行一步扩展:问题求的是取模的结果为0的最大值,那么求出 0 0 0到 k − 1 k-1 k