比赛 |
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;
}