题解 P6433 【「EZEC-1」出题】
update on 7.7:出题人谢罪,修改了一些锅,原来的数据太水了,希望管理员重新通过一下
此题是一道简单的背包
先特判一遍,如果所有
然后用
对于每一对
同时,老师可能没有用完,所以取
c++代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,m,k,f[1005][105];
int a[1005],x[1005],sum,ans=0;
int cmp(int a,int b)
{
return a>b;
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
for (int i=1;i<=n;i++)
scanf("%d%d",&a[i],&x[i]),sum+=x[i];
if (sum<=m)//特判
{
int ans=0;
sort(a+1,a+1+n,cmp);
for (int i=1;i<=k;i++)
ans+=a[i]*2;
for (int i=k+1;i<n;i++)
ans+=a[i];
cout<<ans;
return 0;
}
for (int e=1;e<=n;e++)
for (int i=m;i>=x[e];i--)
{
for (int j=min(k,e);j>=1;j--)//注意,这里要倒叙枚举
f[i][j]=max(f[i][j],max(f[i-x[e]][j]+a[e],f[i-x[e]][j-1]+a[e]*2)),ans=max(ans,f[i][j]);
f[i][0]=max(f[i][0],f[i-x[e]][0]+a[e]);ans=max(ans,f[i][0]);
}
cout<<ans;
return 0;
}