搖錢樹 dp 貪心

2021-07-27 09:31:07 字數 1278 閱讀 2204

搖錢樹time limit:1000ms

memory limit:1000k

total submissions:106

accepted:33

description

cpg 正在遊覽乙個夢中之城,在這個城市中有n棵搖錢樹。。。這下,可讓cpg看傻了。。。可是cpg只能在這個城市中呆k天,但是現在搖錢樹已經成熟了,每天每棵都會掉下不同的金幣。cpg每天可以砍掉其中一顆,並獲得其樹上說有的金幣(怎麼會有這種好事。。。)。請你幫助cpg算出他在這k天中最多能獲得多少金幣。

input

每個檔案中有不超過10組測試資料。

每組測試資料:

第一行兩個整數n,k (1<=k<=n<=1000)

第二行n個整數mi (mi <= 100000).表示cpg剛看到這n棵樹時每刻樹上的金幣數。

第三行n個整數 bi.(bi<=1000)表示每顆搖錢樹,每天將會掉落的金幣。

以n=k=0結束。

output

對每組測試資料,輸出僅一行,cpg在k天中能獲得的最大金幣數。

sample input

3 310 20 30

4 5 6

4 320 30 40 50

2 7 6 5

0 0sample output

47104

題解:令dp[i][j]為前i棵樹砍j棵得到的最大值。

不過要按照掉錢的數量從高到低排個序。

證明:比較兩棵消耗速度分別為v1,v2,總價值為c1,c2的樹

令v1>v2,若在兩樹都一定要取的情況下,且間隔p天,之前過了t天

若先取v1,獲利為s1=c1+c2-p*v1-t*(v1+v2);

若先取v2,獲利為s2=c2+c1-p*v2-t*(v1+v2);

s1一定大於s2

所以要排序。。。

最後還要找一遍最大值。

還有就是m[i]-(j-1)*b[i]有可能是負值,所以要與0取max。

#include#include#include#includeusing namespace std;

typedef long long ll;

ll dp[1005][1005];

struct node

}e[1005];

int main()

} ll ans=0;

for(i=1;i<=k;i++)

cout<

洛谷 P1987 搖錢樹(貪心 dp)

原題鏈結 給定 n 棵搖錢樹,第 i 棵搖錢樹上的初始金幣為 a i 每天會掉下 b i 個金幣。在 k 天內,每天都可以砍一棵搖錢樹,第 i 天砍第 j 棵搖錢樹可以得到 a j i 1 b j 個金幣,求最終得到的金幣數量的最大值。首先可以將題目中的 k 天看成是乙個容量為 k 的揹包,第 j ...

洛谷 P1987 搖錢樹 揹包dp 貪心

cpg 正在遊覽乙個夢中之城,在這個城市中有n棵搖錢樹。這下,可讓cpg看傻了。可是cpg只能在這個城市中呆k天,但是現在搖錢樹已經成熟了,每天每棵都會掉下不同的金幣 不屬於cpg!cpg每天可以砍掉其中一顆,並獲得其樹上說有的金幣 怎麼會有這種好事。請你幫助cpg算出他在這k天中最多能獲得多少金幣...

貪心DP 田忌賽馬

田忌賽馬 描述 description 中國古代的歷史故事 田忌賽馬 是為大家所熟知的。話說齊王和田忌又要賽馬了,他們各派出n匹馬,每場比賽,輸的一方將要給贏的一方200兩 如果是平局的話,雙方都不必拿出錢。現在每匹馬的速度值是固定而且已知的,而齊王出馬也不管田忌的出馬順序。請問田忌該如何安排自己的...