金明的预算

https://www.luogu.org/problem/P1064

在这里插入图片描述

#include <stdio.h>
#define max(a,b) a>b?a:b
#define min(a,b) a>b?b:a
#define ll long long
#define maxn 32010
int read()
{
    int s=0,w=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){s=s*10+ch-'0',ch=getchar();}
    return s*w;
}
int v[61],w[61],q[61],f[maxn],h[maxn];
int main()
{
    int n=read(),m=read();
    for(int i=1;i<=m;i++)
    {
        v[i]=read(),w[i]=read(),q[i]=read();
        w[i]*=v[i];
    }
    for(int i=1;i<=m;i++)
        if(!q[i])              //是主件
        {
            for(int j=1;j<v[i];j++)          //h储存当选这个主件的背包值
                h[j]=0;
            for(int j=v[i];j<=n;j++)
                h[j]=f[j-v[i]]+w[i];
            for(int j=1;j<=m;j++)
                if(q[j]==i)
                    for(int k=n;k>=v[i]+v[j];k--)
                        h[k]=max(h[k],h[k-v[j]]+w[j]);
            for(int j=v[i];j<=n;j++)          //通过比较决定要不要选这个主件
                f[j]=max(f[j],h[j]);
        }
    printf("%d",f[n]);
}
发布了88 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44879687/article/details/103015408