求助简单背包题为什么开了 O2 才能过
查看原帖
求助简单背包题为什么开了 O2 才能过
67952
白鲟楼主2020/11/30 20:04

是我哪里写得不好导致算法退化了吗……

#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

2020/11/30 20:04
加载中...