对于dp值只有0、1两种状态的背包问题,
一来恰好装满型不用初始化为负无穷,因为只有0,1进行比较。
二来,状态转移方程一般不再不再是朴素的max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]
,而极有可能
dp[i][j]=dp[i-1][j]; //不取
if(dp[i-1][j-w[i]]) dp[i][j]+=dp[i-1][j-w[i]];
或者不用if判断,dp值代表是否能到达这种状态,只要 取和不取
两种决策种至少有一种可以达到该状态,dp[i][j]
就为1,能达到dp[i][j]
状态,正是因此特性,可以对dp值采用位运算,
dp[i][j]=dp[i-1][j]|dp[i-1][j-w[i]];
或者滚动数组优化为一维后
dp[j]|=dp[i-1][j-w[i]];
三来,可以考虑bitset优化
看我这篇QAQ