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 2view code3using
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 }
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個。此外,每個掛件有乙個安裝時會獲得的喜悅值,用乙個整數...