hdu-2602-Bone Collector-(0-1背包)

来源:互联网 发布:如何启动蜂窝移动数据 编辑:程序博客网 时间:2024/05/21 06:11

题目传送门:https://vjudge.net/problem/HDU-2602



两种都可以

for(i = n; i >= 1; i--)
{
     for(j = 0; j <= ww; j++)
     {
          if(j < w[i])
               dp[i][j] = dp[i + 1][j];  //第i个物品放入后,因为剩余空间不够无法放入。
          else
                dp[i][j] = max(dp[i + 1][j], dp[i + 1][j - w[i]] + mon[i]);   //表示第i个物品将放入大小为j的背包中。
     }

}

for(int i = 1; i <= n; i++)
{
    for(int j = 0; j <= ww; j++)
    {
        if(j < w[i])
            dp[i][j] = dp[i - 1][j];
        else
            dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + mon[i]);
    }
}




完整代码:

#include <algorithm>#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <cmath>#include <queue>#include <set>#include <map>using namespace std;int dp[1005][1005];int main(){    int t, n, ww, i, j;    int mon[1005], w[1005];    cin >> t;    while(t--)    {        cin >> n >> ww;        memset(dp, 0, sizeof(dp));        for(i = 1; i <= n; i++)            cin >> mon[i];        for(i = 1; i <= n; i++)            cin >> w[i];       for(i = n; i >= 1; i--)       {           for(j = 0; j <= ww; j++)           {               if(j < w[i])                dp[i][j] = dp[i + 1][j];               else                dp[i][j] = max(dp[i + 1][j], dp[i + 1][j - w[i]] + mon[i]);           }       }       cout<<dp[1][ww]<<endl;    }    return 0;}




原创粉丝点击