洛谷 P1417 烹調方案

題目背景

因爲你的幫助,火星只遭受了最小的損失。但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]

相關文章
相關標籤/搜索