有依赖的背包

有依赖背包

#include<iostream>

#include<algorithm>

#include<cstring>

using namespace std;

const int maxn=55;

const int maxv=100005;

int tmp[maxv];

int f[maxn][maxv];

int N,V;  //主件的数量,背包的容量

int main()

{

    while(cin>>N>>V)

    {

        memset(f,0,sizeof(f));

        for(int i=1;i<=N;i++)

        {

            memset(tmp,-1,sizeof(tmp));

            int p,m;  //主件的费用,附件的数量

            cin>>p>>m;

            for(int j=p;j<=V;j++)

                tmp[j]=f[i-1][j-p];

            int v,w;

            for(int j=1;j<=m;j++)

            {

                cin>>v>>w;  //每一个附件的重量和价值

                for(int k=V;k>=v;k--)

                if(tmp[k-v]!=-1)

                    tmp[k]=max(tmp[k],tmp[k-v]+w);

            }

            for(int j=V;j>=0;j--)

                f[i][j]=max(tmp[j],f[i-1][j]);

        }

        cout<<f[N][V]<<endl;

    }

    return 0;

}

原文地址:https://www.cnblogs.com/fanhao050109/p/11228482.html