是我哪里写得不好导致算法退化了吗……
#include<algorithm>
#include<cctype>
#include<cstdio>
#include<functional>
#include<vector>
using namespace std;
const int maxv=10,maxm=1e5,maxlog=17;
int n,m,k,x,y,tot,times[maxv+1][maxv+1],f[maxm+1],value[maxv*maxv*maxlog+1],cost[maxv*maxv*maxlog+1];
inline void read(int &x)
{
x=0;
char t=getchar();
while(!isdigit(t))
t=getchar();
while(isdigit(t))
{
x=x*10+t-'0';
t=getchar();
}
return;
}
inline int max(int x,int y)
{
return x>y?x:y;
}
int main()
{
read(n);
read(m);
read(k);
for(int i=1;i<=n;++i)
{
read(x);
read(y);
if(x)
++times[x][y];
else for(int j=m;~j;--j)
f[j]+=y;
}
for(int i=1;i<=maxv;++i)
for(int j=1;j<=maxv;++j)
{
for(int l=1;l<=times[i][j];l<<=1)
{
value[++tot]=j*l;
cost[tot]=i*l;
times[i][j]-=l;
}
if(times[i][j])
{
value[++tot]=j*times[i][j];
cost[tot]=i*times[i][j];
}
}
for(int i=1;i<=tot;++i)
for(int j=m;j>=cost[i];--j)
f[j]=max(f[j],f[j-cost[i]]+value[i]);
puts(f[m]>=k?"yes":"no");
printf("%d",f[m]);
return 0;
}
救救孩子! /kel