洛谷 P1987 搖錢樹(貪心 dp)

2022-09-09 12:36:24 字數 1467 閱讀 4521

原題鏈結

給定 \(n\) 棵搖錢樹,第 \(i\) 棵搖錢樹上的初始金幣為 \(a_i\),每天會掉下 \(b_i\) 個金幣。在 \(k\) 天內,每天都可以砍一棵搖錢樹,第 \(i\) 天砍第 \(j\) 棵搖錢樹可以得到 \(a_j-(i-1)*b_j\) 個金幣,求最終得到的金幣數量的最大值。

首先可以將題目中的 \(k\) 天看成是乙個容量為 \(k\) 的揹包,第 \(j\) 棵搖錢樹看成是乙個體積為 \(1\),價值為 \(\max(a_j-(i-1)*b_j,0)\) 的物品。其中 \(i\) 表示該物品是第 \(i\) 個放進揹包的物品。那麼也就可以將題目轉化為乙個 經典的 \(01\) 揹包問題。

但是由於有 \((i-1)\) 這個變數在影響價值,所以列舉物品放進揹包的順序不同,答案也會不同。所以需要先按照 \(b_i\) 的大小對物品進行排序,再進行狀態轉移。這是因為本題滿足乙個貪心性質:在放同樣多的物品的所有方案中,先放 \(b_i\)的物品的方案最優。

證明:設當前揹包中已經放了 \(p\) 個物品,現在要放 \(i\) 和 \(j\) 兩個物品。

先放物品 \(i\) 的價值:\(f[p]+a_i-(p-1)*b_i+a_j-p*b_j\)------ ①。

先放物品 \(j\) 的價值:\(f[p]+a_j-(p-1)*b_j+a_i-p*b_i\)------ ②。

① 式減去 ② 式,可以得到:\(b_i-b_j\)。

當 \(b_i>b_j\) 時,先放物品 \(i\) 更優;當 \(b_i時,先放物品 \(j\) 更優。

故同樣放 \(i\) 個物品時,先放 \(b_i\) 大的物品更優。

需要注意的是,最終的答案不一定為 \(f[k]\),如下面這組資料:

3 3

1000000 2 1

1000 10000 111111

顯然在這組資料中,先乙個物品時最優。但是上面的貪心性質就決定了把要所有物品都放進去時,不可能先放第乙個物品。而在所有方案中,滿足第乙個物品最先放進去的方案,就只有 \(f[1]\) 所以在這組樣例中的答案就是 \(f[1]\)。

由這組樣例可以發現,如果要放所有物品,就有可能會放價值已經降到 \(0\) 的物品,而白白浪費了後面價值更大的物品。所以不一定放所有的物品最優。

因此,最終的答案為 \(\max_f[i]\)

#include#include#includeusing namespace std;

const int n=1010;

int n,k,f[n];

struct node

}tr[n];

int max(int a,int b)

int min(int a,int b)

return 0;

}

洛谷 P1987 搖錢樹 揹包dp 貪心

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

洛谷 P2018 訊息傳遞 樹形dp 貪心

巴蜀國的社會等級森嚴,除了國王之外,每個人均有且只有乙個直接上級,當然國王沒有上級。如果a是b的上級,b是c的上級,那麼a就是c的上級。絕對不會出現這樣的關係 a是b的上級,b也是a的上級。最開始的時刻是0,你要做的就是用1單位的時間把乙個訊息告訴某乙個人,讓他們自行散布訊息。在任意乙個時間單位中,...

洛谷 P1233 貪心

一堆木頭棍子共有n根,每根棍子的長度和寬度都是已知的。棍子可以被一台機器乙個接乙個地加工。機器處理一根棍子之前需要準備時間。準備時間是這樣定義的 第一根棍子的準備時間為1分鐘 如果剛處理完長度為l,寬度為w的棍子,那麼如果下乙個棍子長度為li,寬度為wi,並且滿足l li,w wi,這個棍子就不需要...