百练4131 01背包

注意此题必须采用滚动数组的方法:

因此需要注意内循环的顺序:

#include
#include
#include
#include
using namespace std;
const int maxn=3500;

int w[maxn];
int v[maxn];
int f[13000]; //WA点,注意数组范围啊
//f[i][j]表示背包容量为j,可装前i个物品的最大价值

int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d",&w[i],&v[i]);
    }
    memset(f,0,sizeof(f));
    for(int i=1;i<=n;i++)
    {
        for(int j=m;j>=1;j--) //注意此处必须倒着求
        {
           if(w[i]<=j)
           {
               f[j]=max(f[j],f[j-w[i]]+v[i]);
           }
        }
    }
    printf("%d\n",f[m]);

    return 0;
}

你可能感兴趣的:(程序设计导引及在线实践)