BZOJ 4247 掛飾 01揹包

2022-04-01 07:18:15 字數 1056 閱讀 8710

joi君有n個裝在手機上的掛飾,編號為1...n。 joi君可以將其中的一些裝在手機上。

joi君的掛飾有一些與眾不同——其中的一些掛飾附有可以掛其他掛件的掛鉤。每個掛件要麼直接掛在手機上,要麼掛在其他掛件的掛鉤上。直接掛在手機上的掛件最多有1個。

此外,每個掛件有乙個安裝時會獲得的喜悅值,用乙個整數來表示。如果joi君很討厭某個掛飾,那麼這個掛飾的喜悅值就是乙個負數。

joi君想要最大化所有掛飾的喜悅值之和。注意不必要將所有的掛鉤都掛上掛飾,而且乙個都不掛也是可以的。

第一行乙個整數n,代表掛飾的個數。

接下來n行,第i行(1<=i<=n)有兩個空格分隔的整數ai和bi,表示掛飾i有ai個掛鉤,安裝後會獲得bi的喜悅值。 

輸出一行乙個整數,表示手機上連線的掛飾總和的最大值

50 4

2 -2

1 -1

0 10 3

5分析:

狀態的定義的確很精巧,d(i,j) 考慮前 i 個物品,還剩 j 個掛鉤時的最優解(最大開心值),這不就是01揹包了嗎? 其實 j 只需要遍歷到 n,n 以後的都一樣的了。

還有乙個地方要注意的是: 要按照 掛鉤數目從大到小排序,不然掛鉤數目會被減到負數。

1 #include 2

3using

namespace

std;45

struct

node nodes[2500];8

9bool

cmp(node x,node y)

12int dp[2500][2500

];13

14int inf = 0x3f3f3f3f;15

16int

main()

1729}30

int ans = 0;31

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

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

33 printf("

%d\n

",ans);

34return0;

35 }

view code

BZOJ 4247 掛飾 揹包DP

貪心的想法 在保證正確性的情況下盡量多的掛鉤。所以我們先把每個掛飾按照掛鉤數量從大到小排序。f i j f i j f i j 表示排序後的前i ii個物品在有j jj個掛鉤的情況下的最大價值之和。那麼對於第i ii個物品,無非就是選擇與否的關係,樸素的轉移。而對於貪心要保證的正確性,我們在狀態轉移...

BZOJ 4247 掛飾(揹包變形)

雖然轉移方程可以一眼看出 但是煩就煩在為何要排序 有人說這是乙個貪心,又有人說這是乙個保障正確性的。就按照貪心的想法好了 在保證正確性的情況下盡量多的掛鉤。include define n 2005 define inf 0x3f3f3f3f using namespace std int n,f ...

bzoj4247 掛飾 揹包dp

題目描述 joi君有n個裝在手機上的掛飾,編號為1.n。joi君可以將其中的一些裝在手機上。joi君的掛飾有一些與眾不同 其中的一些掛飾附有可以掛其他掛件的掛鉤。每個掛件要麼直接掛在手機上,要麼掛在其他掛件的掛鉤上。直接掛在手機上的掛件最多有1個。此外,每個掛件有乙個安裝時會獲得的喜悅值,用乙個整數...