zeroone bag

今天打算重写01背包,想当年算法课上那个版本现在看来真是最原始的,空间未优化,现在这个不仅空间优化,而且还是一维的推进,
比滚动数组还要简洁,感谢编程菜菜,好像fawkes大神也是这么写的。因为从后面开始递推的话,同行前列的状态还是上一行的状态,
刚好直接利用。另外01背包有点局限了,之前有一个数组里找k个长为m的不想交连续子序列和的最大值其实也是01背包的dp,不能过于局限为装东西。

int n, wei;
while(cin>>n>>wei)
{
    for(int i=0;i<n;i++) cin>>w[i]>>v[i];
    for(int i=1;i<=n;i++) for(int j=wei;j>=w[i-1];j--)
            dp[j]=max(dp[j], dp[j-w[i-1]]+v[i-1]);
    cout<<dp[wei]<<endl;
}

Posted by richard爱闹 - 3月 20 2015
如需转载,请注明: 本文来自 Richard