做题记录 洛谷P1417烹调方案

此题乍一看是普通背包,但由于物品价值不是固定的,而是随时间(重量)而改变。因此,采取不同顺序选取一组相同物品可能产生不同价值。

这种问题属于泛化背包问题,要想解决,就需要固定顺序,然后使用背包。
其实找到顺序并不难,只要根据贪心策略中的相邻项交换法即可得出,若要求x在y前面,就要求c[x]b[y]<c[y]b[x]

还要注意:由于物品价值可以为负数,故不能简单地将dp[T]当成最终答案
因此可以如下实现:

struct Thing {
	llong a,b,c;
	inline bool operator<(Thing x) {return c*x.b<x.c*b;}
};
Thing a[M];
llong dp[MAXT];
int main() {
    //省略输入
    sort(a+1,a+n+1);
    for(int i=1; i<=n; i++) {
	for(int j=T; j>=a[i].c; j--) {
	    dp[j]=max(dp[j],dp[j-a[i].c]+(a[i].a-j*a[i].b));
	}
    }
}
posted @   m0_51303687  阅读(63)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示