洛谷P1417 烹調方案

2021-08-18 16:58:16 字數 1757 閱讀 9621

由於你的幫助,火星只遭受了最小的損失。但gw懶得重建家園了,就造了一艘飛船飛向遙遠的earth星。不過飛船飛到一半,gw發現了乙個很嚴重的問題:肚子餓了~

gw還是會做飯的,於是拿出了儲藏的食物準備填飽肚子。gw希望能在t時間內做出最美味的食物,但是這些食物美味程度的計算方式比較奇葩,於是絕望的gw只好求助於你了。

一共有n件食材,每件食材有三個屬性,ai,bi和ci,如果在t時刻完成第i樣食材則得到ai-t*bi的美味指數,用第i件食材做飯要花去ci的時間。

眾所周知,gw的廚藝不怎麼樣,所以他需要你設計烹調方案使得美味指數最大

輸入格式:

第一行是兩個正整數t和n,表示到達地球所需時間和食材個數。

下面一行n個整數,ai

下面一行n個整數,bi

下面一行n個整數,ci

輸出格式:

輸出最大美味指數

輸入樣例#1:

複製

74 1

5022

47

輸出樣例#1:

複製

408

【資料範圍】

對於40%的資料1<=n<=10

對於100%的資料1<=n<=50

所有數字均小於100,000

【題目**】

tinylic改編

思路:dp,得先排序

參考:by tinylic

如果沒有b[i]這個屬性的話就是明顯的01揹包問題。

現在考慮相鄰的兩個物品x,y。假設現在已經耗費p的時間,那麼分別列出先做x,y的代價:

a[x]-(p+c[x])*b[x]+a[y]-(p+c[x]+c[y])*by

a[y]-(p+c[y])*b[y]+a[x]-(p+c[y]+c[x])*bx

對這兩個式子化簡,得到①>②的條件是c[x]*b[y]發現只要滿足這個條件的物品對(x,y),x在y前的代價永遠更優。

因此可以根據這個條件進行排序,之後就是簡單的01揹包了。

寫法一:一維dp

#include#include#define maxn 52

using namespace std;

typedef long long ll;

int t;

int n;

struct node

dish[55];

ll dp[100009];

ll ans;

int cmp(node x, node y)

int main()

//for (int i = 1; i <= t; i++) ans = max(ans, dp[i]);

cout << ans;

return 0;

}

寫法二:二維dp

#include#include#define maxn 52

using namespace std;

typedef long long ll;

int t;

int n;

struct node

dish[55];

ll dp[maxn][100009];

ll ans;

int cmp(node x, node y)

int main()

for (int i = 1; i <= t; i++) ans = max(ans, dp[n][i]);

cout << ans;

return 0;

}

洛谷P1417 烹調方案

這道題不同於普通的01揹包,不同的先選擇的做菜策略會對之後產生不同的影響,即不滿足 無後效性 但是,考慮一種選擇策略,假設有兩個先後做的菜i和j,交換他們的順序會產生什麼影響呢?假設ij之前的時間為t 先i後j a i t c i b i a j t c i c j b j 先j後i a j t c...

洛谷 P1417烹調方案

洛谷 p1417烹調方案 由於你的幫助,火星只遭受了最小的損失。但gw懶得重建家園了,就造了一艘飛船飛向遙遠的earth星。不過飛船飛到一半,gw發現了乙個很嚴重的問題 肚子餓了 gw還是會做飯的,於是拿出了儲藏的食物準備填飽肚子。gw希望能在t時間內做出最美味的食物,但是這些食物美味程度的計算方式...

洛谷 P1417烹調方案

一共有n件食材,每件食材有三個屬性,ai,bi和ci,如果在t時刻完成第i樣食材則得到ai t bi的美味指數,用第i件食材做飯要花去ci的時間。求最大美味指數之和。顯然的0 1揹包,但是,它與平常的0 1揹包不同之處在於 平常的物品不會因為時間的延續而使價值貶值,也就是說,先放a 先放b是無所謂的...