比赛 2020级再出发之二进制拆分及运用 评测结果 AAAAAAAAAA
题目名称 宝物筛选 最终得分 100
用户昵称 小金 运行时间 1.055 s
代码语言 C++ 内存使用 4.76 MiB
提交时间 2023-07-24 15:29:36
显示代码纯文本
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int n,w,a[100010],m[100010],t=0;//a-价值,m-重量 
long long f[40010];
void c(int v2,int w2,int m2)
{
    int q=1;
    while(m2>=q)
    {
        t++;
        a[t]=v2*q;
        m[t]=w2*q;
        m2-=q;
        q=q*2;
    }
    if(m2>0)
    {
        t++;
        a[t]=v2*m2;
        m[t]=w2*m2;
    }
}
void dp()
{
    for(int i=1;i<=t;i++)
    {
        for(int j=w;j>=m[i];j--)
        {
            f[j]=max(f[j],f[j-m[i]]+a[i]);
        }
    }
}
int main()
{
    freopen("treasure.in","r",stdin);
    freopen("treasure.out","w",stdout);
    memset(f,0,sizeof(f));
    memset(a,0,sizeof(a));
    memset(m,0,sizeof(m));
    cin>>n>>w;
    for(int i=1;i<=n;i++)
    {
        int a2,m2,s2;
        cin>>a2>>m2>>s2;
        c(a2,m2,s2);
    }
    dp();
    cout<<f[w];
    return 0;
}