#include
而这道题的模型变成了:总重量必须是 x x x的倍数时能取到的最大价值。
解法其实是一样的,不同的是本来要维护前 i i i 个物品重量为 j j j的最大值,现在变成了 前 i i i个物品重量模 k k k为 j j j的最大值
d p [ i ] [ j ] dp[i][j] dp[i][j]表示:考虑前j个物品,消耗总和% k = j k=j k=j的威力最大值
因为求的是最大值,区分于求方案数的DP,dp方程不再累加,而是求max
集合划分:
考虑1:
( d p [ i ] [ j ] dp[i][j] dp[i][j]由哪些状态推导来)
(这样考虑的话,涉及负数取模)
负数取模的技巧:先转化为绝对值小于k的负数,然后再加k再模k
d p [ i ] [ j ] = m a x ( d p [ i ] [ j ] , d p [ i − 1 ] [ ( j − a [ i ] dp[i][j]=max(dp[i][j],dp[i-1][(j-a[i] dp[i][j]=max(dp[i][j],dp[i−1][(j−a[i]% k + k ) k+k) k+k)% k ] + b [ i ] ) k]+b[i]) k]+b[i])
考虑2:
(是否选定第i个物品影响了什么)
d p [ i ] [ ( j + a [ i ] ) dp[i][(j+a[i]) dp[i][(j+a[i])% k ] = m a x ( d p [ i ] [ ( j + a [ i ] ) k]=max(dp[i][(j+a[i]) k]=max(dp[i][(j+a[i])% k ] , d p [ i − 1 ] [ j ] + b [ i ] ) k],dp[i-1][j]+b[i]) k],dp[i−1][j]+b[i])
#include