NYOJ747 螞蟻的難題 三 貪心 DP

2021-06-22 16:37:00 字數 1535 閱讀 1681

題目鏈結 nyoj747

【題意】

時間限制:

2000 ms  |            記憶體限制:

65535 kb

難度: 4

描述 螞蟻終於把盡可能多的食材都搬回家了,現在開始了大廚計畫。

已知一共有n件食材,每件食材有乙個美味度ai和新鮮度bi, 如果螞蟻在第t時刻將第i樣食材烹飪成功,則得到ai-t*bi的美味指數,當然,用第i件食材做飯要花去ci的時間。

眾所周知,螞蟻的廚藝不怎麼樣,所以他需要你設計做飯方案使得在時間 

t

內完成的美味指數最大。

輸入

有多組測試資料。

第一行是兩個正整數,表示螞蟻的做飯時間t和食材個數n。(n<=50, 1<=t<=100000)。

接下來n行,每行有三個數,ai,bi,ci。分別代表美味度、新鮮度和用該食材做飯花費的時間。(0輸出

輸出乙個數字,表示最大美味指數

樣例輸入

6 1

200 5 1

樣例輸出

195

【分析】

很像01揹包,一開始知道需要先貪心排序,但是怎麼也找不到如果排序,貪心還是太弱,後來看了出題人的部落格才知道;需要用相鄰的兩個物品1和2;

然後分別寫出1先做和2先做可以得到的最大價值,並且假設現在已經是t時刻:

如果1物品先做:a[1]-(p+c[1])*b[1]+a[2]-(p+c[1]+c[2])*b2;(1)

如果2物品先做:a[2]-(p+c[2])*b[2]+a[1]-(p+c[1]+c[2])*b1;(2)

則可以按照(1)>(2)來排序,化簡(1)>(2)為c[2]*b[1]>c[1]*b[2];

接下來直接01揹包就可以了

【ac**】32ms

#include #include #include using namespace std;

#define maxn 100001

#define min(a,b) (ab?a:b)

struct nodep[51];

int ans, ch, dp[maxn];

int in()

inline bool cmp(const node& a, const node& b)

int main()

sort(p,p+n,cmp);

memset(dp,0,sizeof(dp));

for (int i = 0; i < n; i++)

for (int i = 0; i <= m; i++)

ans = max(ans,dp[i]);

printf("%d\n", ans);

} return 0;

}

nyoj 747 螞蟻的難題 三

時間限制 2000 ms 記憶體限制 65535 kb 難度 4 描述 螞蟻終於把盡可能多的食材都搬回家了,現在開始了大廚計畫。已知一共有n件食材,每件食材有乙個美味度ai和新鮮度bi,如果螞蟻在第t時刻將第i樣食材烹飪成功,則得到ai t bi的美味指數,當然,用第i件食材做飯要花去ci的時間。眾...

nyoj 747 螞蟻的難題 三 dp揹包

時間限制 2000 ms 記憶體限制 65535 kb 難度 4 描述 螞蟻終於把盡可能多的食材都搬回家了,現在開始了大廚計畫。已知一共有n件食材,每件食材有乙個美味度ai和新鮮度bi,如果螞蟻在第t時刻將第i樣食材烹飪成功,則得到ai t bi的美味指數,當然,用第i件食材做飯要花去ci的時間。眾...

螞蟻的難題 三

螞蟻的難題 三 時間限制 2000 ms 記憶體限制 65535kb 難度 4 描述 螞蟻終於把盡可能多的食材都搬回家了,現在開始了大廚計畫。已知一共有n件食材,每件食材有乙個美味度ai和新鮮度bi,如果螞蟻在第t時刻將第i樣食材烹飪成功,則得到ai t bi的美味指數,當然,用第i件食材做飯要花去...