因爲你的幫助,火星只遭受了最小的損失。但gw懶得重建家園了,就造了一艘飛船飛向遙遠的earth星。不過飛船飛到一半,gw發現了一個很嚴重的問題:肚子餓了~node
gw仍是會作飯的,因而拿出了儲藏的食物準備填飽肚子。gw但願能在T時間內作出最美味的食物,可是這些食物美味程度的計算方式比較奇葩,因而絕望的gw只好求助於你了。ios
一共有n件食材,每件食材有三個屬性,ai,bi和ci,若是在t時刻完成第i樣食材則獲得ai-t*bi的美味指數,用第i件食材作飯要花去ci的時間。ide
衆所周知,gw的廚藝不怎麼樣,因此他須要你設計烹調方案使得美味指數最大spa
輸入格式:設計
第一行是兩個正整數T和n,表示到達地球所需時間和食材個數。code
下面一行n個整數,aiblog
下面一行n個整數,bi排序
下面一行n個整數,cici
輸出格式:get
輸出最大美味指數
輸入樣例#1:
74 1
502
2
47
輸出樣例#1:
408
通常的01揹包,因爲價值是固定不變的,因此順序對結果不影響,可是這道題它的價值卻不是固定的,因此首先須要排序;
1)式:a[x] - (p+c[x]) * b[x] + a[y] - (p+c[x]+c[y]) * b[y]
2)式:a[y] - (p+c[y]) * b[y] + a[x] - (p+c[y]+c[x]) * b[x]
由 1) > 2) 可得:c[x] * b[y] < c[y] * b[x]
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 typedef long long ll; 5 struct node{ 6 ll a, b, c; 7 }t[100100]; 8 ll dp[100100]; 9 bool cmp(node &x, node &y){ 10 return x.c * y.b < y.c * x.b; 11 } 12 int main(){ 13 ll time, n; 14 cin >> time >> n; 15 for(ll i = 1; i <= n; i++) cin >> t[i].a; 16 for(ll i = 1; i <= n; i++) cin >> t[i].b; 17 for(ll i = 1; i <= n; i++) cin >> t[i].c; 18 sort(t + 1, t + n + 1, cmp); 19 for(ll i = 1; i <= n; i++){ 20 for(ll j = time; j >= t[i].c; j--){ 21 dp[j] = max(dp[j], dp[j - t[i].c] + t[i].a - j * t[i].b); 22 } 23 } 24 ll maxn = -1; 25 for(ll i = 0; i <= time; i++){ 26 maxn = max(maxn, dp[i]); 27 } 28 cout << maxn << endl; 29 return 0; 30 }
答案不必定是f[time]