美味菜餚(01揹包)

2021-10-08 00:07:14 字數 1635 閱讀 8946

題目描述:

小明是個大廚,早上起來他開始一天的工作。他所在的餐廳每天早上都會買好n件食材(每種食材的數量可以視為無限),小明從到達餐廳開始就連續工作 t 時間。每道菜餚的製作需要特定的一種食材以及一段時間,但是食材一旦放久就不新鮮了,菜的美味值會降低。第i道菜餚有三個屬性ai,bi,ci,ai 是該菜餚的美味值,bi 是該菜餚所選食材不新鮮的速率,如果在第t時刻完成第i道菜則美味值為:ai - t * bi,完成這道菜需要 ci 的時間。小明希望在這t時間內能做出菜餚使得總美味值最大,所以小明求助於你。

輸入描述:

第1行輸入三個整數n,m,t,分別代表食材種類,菜餚種類和工作時間。

第2行輸入n個整數bi,代表第i個食材不新鮮的速率。

第3-n+2行,每行輸入三個整數 j,ai,ci,分別代表第i道菜餚需要的食材編號,菜餚的美味值,完成時間。

資料保證:06,美味值必須通過完整做出菜餚得到,資料保證在規定時間內至少能完整做出1道菜餚。

輸出描述:

輸出一行,乙個整數,表示最大總美味值。

思路:明顯的是01揹包,即每道菜可以選擇做或不做,但是美味值由於做菜的時間會變化,所以我們要把美味值確定下來,假設 x 在y之前做,則:

ax - cx* bx + ay - (cx+cy) * by >= ay - cy* by + ax - (cy+cx) * bx

即:cx*by

<= cy * bx ,所以按此做菜的順序即可確定每道菜的美味值;

然後就可以01揹包了,dp[i][j]:表示前 i 道菜在第 j 分鐘選做一些菜而得到的最大美味值;所以max( dp[m][ i ] )即為答案。

#include

using

namespace std;

typedef

long

long ll;

const

int n =

55,m =

1e6+7;

ll v[n]

;ll dp[m]

;struct nodea[n]

;bool

cmp(node a,node b)

intmain()

;}sort

(a+1

,a+1

+m,cmp)

;memset

(dp,

-0x3f

,sizeof dp)

; dp[0]

=0;for

(int i=

1;i<=m;i++

)for

(int j=t;j>=a[i]

.t;j--

) dp[j]

=max

(dp[j]

,dp[j-a[i]

.t]+ a[i]

.y-j*a[i]

.v);

ll ans =

-1e15

;for

(int i=

1;i<=t;i++

) ans =

max(ans,dp[i]);

cout

}

揹包 01揹包

01揹包 有n種物品與承重為m的揹包。每種物品只有一件,每個物品都有對應的重量weight i 與價值value i 求解如何裝包使得價值最大。dp i,v 表示前i個物體 包括第i個 面對容量為v的揹包的最大價值,c i 代表物體i的重量,w i 代表物體i的價值 如果第i個物體不放入揹包,則揹包...

揹包專題 01揹包

暑假集訓開始了,按照隊裡的分配,我是弄dp的,嘛,於是我又一次的開始了從01揹包開始學習,昨天將杭電的幾道01揹包重新做了一遍,下面講講我自己對於01揹包的理解。首先01揹包題目的雛形是 有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。...

01揹包,完全揹包

動態規劃 動態規劃的核心是狀態以及狀態轉移方程。需要定義乙個 i,j 狀態以及該狀態的指標函式d i,j 01揹包 有n種物品,每種只有乙個,第i件物品的體積為vi質量為wi。選一些物品裝到體積為c的揹包中,使其體積不超過c的前提下重量最大。namevw abcd e 子問題定義 dp i j 表示...