背包问题至多/恰好/至少

72次阅读
没有评论

共计 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


正文完
 0
ouyu69
版权声明:本站原创文章,由 ouyu69 于2024-10-25发表,共计673字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
文章搜索
评论(没有评论)