共计 673 个字符,预计需要花费 2 分钟才能阅读完成。
价值的计算
至多
memset(dp,0,sizeof dp) ; j>=v[i];
这说明我们上一个状态没有装满也可以转移过来。
比如说
dp[2] = 0,dp[1] = 0,w[1] = 1,v[1] = 1我们可以得到dp[2] = max(dp[2],dp[2-w[1]] + v[1]);因为dp[1] = 0,这时里面什么都没有装,但我们依旧可以从此转移,所以之后类推这样的没装满的状态也是可以转移的。
恰好
求最小值:memset(dp,INF,sizeof dp) ; dp[0] = 0; j>=w[i];
求最大值:memset(dp,-INF,sizeof dp) ; dp[0] = 0; j>=w[i];
对于求最小值:最大值加上一个数后与INF取最小值呢肯定还是INF
对于求最大值:if(dp[j - w[i]] != -INF)才可以转移,说明上一个装满的状态存在
这样就能让原来没有装满的状态无法转移,因为没有装满的状态的dp值是INF/-INF,这样的值就算加上v[i]也依旧是INF/-INF ,也就可以说是不会转移的的,相当于是一个标记;
至少
求最小值:memset(dp,INF,sizeof dp) ; dp[0] = 0;
求最大值:memset(dp,-INF,sizeof dp) ; dp[0] = 0;
对于求最小值:最大值加上一个数后与INF取最小值肯定还是INF
对于求最大值:if(dp[j - w[i]] != -INF)才可以转移,说明上一个至少的状态存在
方案数的计算
至多
dp[i] = 1,0 <= i <=n,j>=w[i]其余都是0
恰好
dp[0] = 1,j>=w[i],其余都是0,
至少
dp[0] = 1,其余都是0