做题记录 洛谷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));
	}
    }
}
                    
                
                
            
        
浙公网安备 33010602011771号