求助一道简单DP题
  • 板块题目总版
  • 楼主渡鸦2007
  • 当前回复5
  • 已保存回复5
  • 发布时间2021/9/12 16:02
  • 上次更新2023/11/4 06:58:16
查看原帖
求助一道简单DP题
385748
渡鸦2007楼主2021/9/12 16:02

代码:

int main()
{
	int y=read();int m=read();
	for (re int i=1;i<=m;++i)
	{
		a[i]=read();
		b[i]=read();
	}
	int cost=0x3f3f3f3f,_max=0;//总最小花费与最大质量
   //类似于状态压缩的表示法,相当于搜索
	for (re int i=0;i<=(1<<(m))-1;++i)
	{
		int price=0,weight=0;//本次花费和质量
		for (re int j=1;j<=m;++j)
		{
			if ( (i & (1<<(j-1)) ) != 0 )
			{
				price+=a[i];
				weight+=b[i];
			}
		}
		if (price<=y)
		{
			if (weight>_max)
			{
				_max=weight;
				cost=price;
			}
			else if (weight==_max)
			{
				cost=min(cost,price);
			}
		}
	}
	y-=cost;
	int x=read();
   //正常完全背包
	for (re int i=1;i<=x;++i)
	{
		int c,d;
		c=read();
		d=read();
		for (re int j=c;j<=y;++j)
		{
			dp[j]=max(dp[j],dp[j-c]+d);
		}
	}
	int ans=0;
	for (re int i=0;i<=y;++i)
	{
		ans=max(ans,dp[i]);
	}
	cout<<ans;
	fclose(stdin);
	fclose(stdout);
	return 0;
}
2021/9/12 16:02
加载中...