思路:首先比較容易想到是取和不取的揹包問題,其次發現裡面有完全揹包和多重揹包。所以樸素的做法就是當前物品是多重揹包時候,用多重揹包的解法,當前揹包是完全揹包時候,用完全揹包的解法。
這樣會t兩個點。當然你開o2可以過,但是沒必要。
#include#include#include#include#include#include#include#include#include#define debug(a) cout<<#a<<"="<=t[i];j--)}}
} printf("%lld\n",dp[t]);
return 0;
}
考慮優化:在做多重揹包的部分,是樸素的把其物品拆成乙個乙個的,考慮每個取還是不取,成為了乙個01揹包問題,轉化成列舉取幾個。
那麼這裡是可以用類似倍增的思想二進位制優化的。
記錄當前物品的總個數(假設有n個)和總價值,按照二進位制將其log(n)堆,同時每一堆的價值是該堆的數量×該物品的單價。
比如8件單價為4的物品a,分成(1,4),(2,8)(4,16)(5,20)最多了。當然這裡最後的那部分不夠20就直接把最後一部分湊成一堆。
這樣選幾個的問題轉化到了選幾堆的問題,比如選1和3堆,就相當於選了5個,總和為20的物品,對應原來01中樸素的乙個個選的時候列舉到5個的時候。
**上注意:空間給夠。因為要考慮每個物品多出來的數量。
#include#include#include#include#include#include#include#include#include#define debug(a) cout<<#a<<"="<0)
}cout<}
P1833 櫻花(二進位制優化揹包)
愛與愁的故事第四彈 plant 第一章。愛與愁大神後院裡種了 nn 棵櫻花樹,每棵都有美學值 c ici 愛與愁大神在每天上學前都會來賞花。愛與愁大神可是生物學霸,他懂得如何欣賞櫻花 一種櫻花樹看一遍過,一種櫻花樹最多看 a iai 遍,一種櫻花樹可以看無數遍。但是看每棵櫻花樹都有一定的時間 t i...
混合揹包 洛谷P1833 櫻花
愛與愁大神後院裡種了n棵櫻花樹,每棵都有美學值ci。愛與愁大神在每天上學前都會來賞花。愛與愁大神可是生物學霸,他懂得如何欣賞櫻花 一種櫻花樹看一遍過,一種櫻花樹最多看ai遍,一種櫻花樹可以看無數遍。但是看每棵櫻花樹都有一定的時間ti。愛與愁大神離去上學的時間只剩下一小會兒了。求解看哪幾棵櫻花樹能使美...
P1833 櫻花 揹包DP 多重揹包 , 混合揹包
混合揹包是指很多種揹包一起做。此題屬於多重揹包的模板題 思想是統統轉化為01揹包 題目中有01揹包 p 1 完全揹包 p 0 多重哦揹包 p k 完全揹包,只需將p t w 多重揹包,只需進行二進位制拆分 注意陣列開大 int readint while ch 0 ch 9 return x f l...