由於你的幫助,火星只遭受了最小的損失。但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 15022
47
輸出 #1複製
408
【資料範圍】
對於40%的資料1<=n<=10
對於100%的資料1<=n<=50
所有數字均小於100,000
【題目**】
tinylic改編
思路
第一眼覺得是乙個01揹包問題,寫了寫過了樣例,但是只能過6個點。
然後發現由於時間不同,實際上每個物品的價值也會受到影響。
一種物品在不同的時間上可以看作是多種物品。
可以用數學歸納法證明:
假設對於相鄰的兩個時間點x和y
分別有兩種不同的價值
若先選x(也就是後選y,t[x]=t+c[x],t[y]=t+c[x]+c[y]):
v1=a[x]-(t+c[x])*b[x]+a[y]-(t+c[x]+c[y])*b[y]
若先選y:
v2=a[y]-(t+c[y])*b[y]+a[x]-(t+c[y]+c[x])*b[x]
假定先選x價值大
將v1、v2去括號展開,相減
最終得到:c[y]*b[x]>c[x]*b[y];
由此,保證了取得區域性最優解的情況下進行01揹包,就可以求解出答案了
code
#include
<
bits/stdc++.h
>
#define
dbg(
x) cout <<
#x<<"=
"<< x << endl
#define
eps1e-
8#define
piacos(
-1.0
)using
namespace std;
typedef
long
long ll;
const
int inf =
0x3f3f3f3f
;template
<
class t>
inline
void
read(t &
res)
namespace _buff
return ib == ie ?-1
:*ib++;}
}int
qread()
if(c =='-
')for(; c >='0
'&& c <='9
'; c =
getc())
return pos ? ret :
-ret;
}const
int maxn =1e
5+7;
int t, n;
struct node
v[maxn];
ll f
[maxn];
bool
cmp(node x
, node y
)int
main()
for(
int i =
1; i <= n;
++i )
for(
int i =
1; i <= n;
++i )
ll ans = int_min;
sort(v +
1, v + n +
1, cmp);
for(
int i =
1; i <= n;
++i )
}for
(int i =
0; i <= t;
++i )
cout << ans << endl;
return0;
}
P1417 烹調方案
p1417 烹調方案 題目提供者tinylic 標籤動態規劃 難度普及 提高 題目背景 由於你的幫助,火星只遭受了最小的損失。但gw懶得重建家園了,就造了一艘飛船飛向遙遠的earth星。不過飛船飛到一半,gw發現了乙個很嚴重的問題 肚子餓了 gw還是會做飯的,於是拿出了儲藏的食物準備填飽肚子。gw希...
P1417 烹調方案
由於你的幫助,火星只遭受了最小的損失。但gw懶得重建家園了,就造了一艘飛船飛向遙遠的earth星。不過飛船飛到一半,gw發現了乙個很嚴重的問題 肚子餓了 gw還是會做飯的,於是拿出了儲藏的食物準備填飽肚子。gw希望能在t時間內做出最美味的食物,但是這些食物美味程度的計算方式比較奇葩,於是絕望的gw只...
洛谷 P1417 烹調方案 揹包dp
由於你的幫助,火星只遭受了最小的損失。但gw懶得重建家園了,就造了一艘飛船飛向遙遠的earth星。不過飛船飛到一半,gw發現了乙個很嚴重的問題 肚子餓了 gw還是會做飯的,於是拿出了儲藏的食物準備填飽肚子。gw希望能在t時間內做出最美味的食物,但是這些食物美味程度的計算方式比較奇葩,於是絕望的gw只...