题解 [USACO10JAN]Cheese Towers S

给同学讲完全背包时找到的一个好题。

题目分析

我们首先知道,如果这个题没有大奶酪,那么就是一个裸的完全背包,代码可以参考这题

这题难就难在如果我们加上大奶酪之后要怎么处理。

首先,我们知道最优解只有可能是一下两种情况:

  1. 塔内没有大奶酪,也就是完全背包的板子。
  2. 我们选择把大奶酪放到最顶端,因为如果在这个奶酪塔里有大奶酪,那么把它放到最顶端肯定不会使答案变差。

答案是两者取最大值。

对于第二种情况的处理,我们可以尝试去枚举最顶端的那个大奶酪,然后用 \(v_i+f_{(t-c[i])\times5/4}\) 来取最大值,从而可以求出第二种的答案。

其实这道题的核心就是第二种情况的处理,因此这里给出第二种情况的代码。

	for(int i=1;i<=n;i++)
	{
		if(c[i]>=k)//如果是大奶酪
		{
			int tmp1=v[i]+f[(t-c[i])*5/4];//求出要被用来更新这个值
			tmp=max(tmp1,tmp);//更新值
		}
	}
posted @ 2021-12-15 22:04  zplqwq  阅读(54)  评论(0)    收藏  举报