做题记录 洛谷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));
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律