二进制优化求助!
查看原帖
二进制优化求助!
471571
封禁用户楼主2023/5/4 17:50

rt

#include<bits/stdc++.h>
#define M 1001
#define inf 0x3f3f3f3f
using namespace std;
inline int read()
{
	int k=0,f=0;char c=getchar();
	for(;!isdigit(c);c=getchar()) f|=c=='-';
	for(;isdigit(c);c=getchar()) k=(k<<1)+(k<<3)+(c^48);
	return f?-k:k;
}
int n,m,minn=inf;
int num[5],s[5][M],ans;
int k[M][5],res;
struct node{
	int cost,value;
}w[M];
bool cmp(node x,node y)
{
	if(x.cost==y.cost) return x.value>y.value;
	else return x.cost<y.cost;
}
int calc(int a,int b,int c,int d)
{
	return minn*a+(minn+1)*b+(minn+2)*c+(minn+3)*d;
}
void dfs(int p,int a,int b,int c,int d)
{
	if(calc(a,b,c,d)>m) return;
	if(p==res+1)
	{
		ans=max(ans,s[0][a]+s[1][b]+s[2][c]+s[3][d]);
//		printf("%d %d %d %d %d\n",ans,a,b,c,d);
		return;
	}
	dfs(p+1,a+k[p][0],b+k[p][1],c+k[p][2],d+k[p][3]);
	dfs(p+1,a,b,c,d);
}
int main()
{
	n=read(),m=read();
	for(int i=1;i<=n;i++)
	{
		w[i].cost=read(),w[i].value=read();
		minn=min(minn,w[i].cost);
	}
	for(int i=1;i<=n;i++) w[i].cost=w[i].cost-minn;
	sort(w+1,w+n+1,cmp);
	for(int i=1;i<=n;i++) s[w[i].cost][++num[w[i].cost]]=s[w[i].cost][num[w[i].cost]-1]+w[i].value;
	for(int i=0;i<=3;i++)
	{
		int v=1;
		while(num[i]>=v)
		{
			k[++res][i]=v;
			num[i]-=v;
			v*=2;
		}
		if(num[i])
		{
			k[++res][i]=num[i];
			num[i]=0;
		}
	}
	dfs(1,0,0,0,0);
	printf("%d",ans);
	return 0;
}

有没有神牟帮帮wo

2023/5/4 17:50
加载中...