Tyvj1057

题目链接

分析:
背包,写的时候记住

不要手残

这里写代码片
#include<cstdio>
#include<cstring>
#include<iostream>

using namespace std;

const int N=100005;
int f[32005];
int w[N],v[N],tot=0;
int fj[N][2];
bool p[N];
int n,m;

int main()
{
    scanf("%d%d",&n,&m);
    memset(p,1,sizeof(p));
    for (int i=1;i<=m;i++)
    {
        int u,e,z;
        scanf("%d%d%d",&u,&e,&z);
        w[i]=u; v[i]=e*u;
        if (z)  //附件 
            p[i]=0,fj[z][fj[z][0]==0 ? 0:1]=i;
    }
    for (int i=1;i<=m;i++)
        for (int j=n;j>=w[i];j--)
            if (p[i])
            {
                f[j]=max(f[j],f[j-w[i]]+v[i]);
                if (fj[i][0]&&j>=w[i]+w[fj[i][0]])
                   f[j]=max(f[j],f[j-w[i]-w[fj[i][0]]]+v[i]+v[fj[i][0]]);
                if (fj[i][1]&&j>=w[i]+w[fj[i][1]])
                   f[j]=max(f[j],f[j-w[i]-w[fj[i][1]]]+v[i]+v[fj[i][1]]);
                if (fj[i][0]&&fj[i][1]&&j>=w[i]+w[fj[i][0]]+w[fj[i][1]])
                   f[j]=max(f[j],f[j-w[i]-w[fj[i][0]]-w[fj[i][1]]]+v[i]+v[fj[i][0]]+v[fj[i][1]]);
            }   
    printf("%d",f[n]);
    return 0;
}
原文地址:https://www.cnblogs.com/wutongtong3117/p/7673305.html