hdu 3535 AreYouBusy 混合揹包

2021-07-11 16:16:36 字數 552 閱讀 5583

題意:有三種任務,至少完成乙個,至多完成乙個,任意完成。現在給出k組任務,每組任務都屬於三種任務的一種。每個任務都會消耗時間,獲得幸福感。求時間t內的最大滿足感。

三種揹包的混合。還是考察對揹包問題的理解。顯然一維已經滿足不了要求了,我們設d[k][j]代表第k組容量為j時獲得的最大滿足感。

可以明顯比較出三種揹包的區別。(任意取也就是01揹包)

任意取,至少取一種的區別:不取的狀態是否非法。

任意取,至多取一種的區別:在當前組已取的情況下是否繼續取。

#include #include#include#include#define n 110

using namespace std;

int d[n][n];

int main()

if(s==1)

for(int j=t;j>=c;j--)

if(d[k-1][j-c]!=-1) d[k][j]=max(d[k][j],d[k-1][j-c]+w);

if(s==2)

for(int j=t;j>=c;j--)}}

cout<

HDU 3535 揹包綜合

題意 給3種揹包,一種是至少裝乙個,一種是最多裝乙個,一種任意。首先要對一維狀態的原始揹包很熟悉才可以。此處的i代表滾動的揹包型別。1.任意的話就是01揹包 初始化 dp i j dp i 1 j dp i j max dp i j w i 存在.2.最多裝乙個,就是比較替換。初始化 dp i j ...

hdu3535AreYouBusy(分組揹包問題)

常見的有三種,一,每組最多取乙個,一維陣列的偽 for 所有的組k for v v to 0 for 所有的i屬於組k f v max 注意順序不能寫反,因為要限制每組最多取乙個 二,每組任意取 既然上面的順序是限制每組最多取乙個,那調換一下順序即可,其實就是01揹包。一維陣列的偽 for 所有的組...

題解 hdu3535 混合揹包

題目鏈結 思路摘抄自大佬部落格 首先如果存在最優解,我們可以互換不同工作集合的處理順序,依然能得到最優解.那麼我們下面只需要處理每個單獨的工作集合即可.令dp i j x表示處理完前i組工作集,所花時間 j時的快樂值為x。每得到一組工作就進行一次dp,所以dp i 為第i組的結果。下面對三種情況進行...