題目描述:思路:明顯的是01揹包,即每道菜可以選擇做或不做,但是美味值由於做菜的時間會變化,所以我們要把美味值確定下來,假設 x 在y之前做,則:小明是個大廚,早上起來他開始一天的工作。他所在的餐廳每天早上都會買好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道菜餚。
輸出描述:
輸出一行,乙個整數,表示最大總美味值。
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 表示...