解题思路:
如果没有b[i]这个属性的话就是明显的01背包问题。
现在考虑相邻的两个物品x,y。假设现在已经耗费p的时间,那么分别列出先做x,y的代价:
a[x]-(p+c[x])*b[x]+a[y]-(p+c[x]+c[y])*b[y] (①)
a[y]-(p+c[y])*b[y]+a[x]-(p+c[y]+c[x])*b[x] (②)
对这两个式子化简,得到①>②的条件是c[x]*b[y]<c[y]*b[x].
发现只要满足这个条件的物品对(x,y),x在y前的代价永远更优。
因此可以根据这个条件进行排序,之后就是简单的01背包了。
补充的解释:
1.为什么不能直接用01背包?2.为什么排序后01背包就是对的?
物品的价值会随时间的变化而变化,每个时间对应一个价值(==不同物品),而只能选一次,自然不能用01背包。(不同顺序选取会影响答案,而01背包不会)
再者分析01背包的循环,最优解的情况是按1到n升序选取的(for(1~n))(当然对01背包,这个序没什么用),排完序后,01背包出来的最优解也一定以升序选取。
#include<iostream>
#include<algorithm>
using namespace std;
struct node {
long long a, b, c;
};
bool cmp