hdu3535AreYouBusy(分組揹包問題)

2021-07-17 05:08:10 字數 1459 閱讀 8946

常見的有三種,

一,每組最多取乙個,

一維陣列的偽**

for 所有的組k

for v = v to 0

for 所有的i屬於組k

f[v] = max

注意順序不能寫反,因為要限制每組最多取乙個

二,每組任意取

既然上面的順序是限制每組最多取乙個,那調換一下順序即可,其實就是01揹包。

一維陣列的偽**

for 所有的組k

for 所有的i屬於組k

for v = v to 0

f[v] = max

三,每組至少取乙個

沒見過一維的偽**,

dp[ki}[i}表示當前不選,dp[ki-1}[i-b[ki}}+c[ki}表示這是第乙個選,

dp[ki}[i-b[ki}}+c[ki}表示再在這一組中選。

初始化時記得ki==0,賦值0,

其他賦值-inf

dp[ki}[i}=max(dp[ki}[i},dp[ki-1}[i-b[ki}}+c[ki},dp[ki}[i-b[ki}}+c[ki})

//分開寫時要注意順序!!!

下面這道題是這三種的綜合,由於第三種情況要用二維寫,所以就都用二維寫。

if(type==0) 

for(int i=0;i

<=t;i++) dp[ni]

[i]=-inf;

else

for(int i=0;i

<=t;i++) dp[ni]

[i]=dp[ni-1]

[i];

上面**是將狀態從上乙個組傳遞到當前組。

#include 

#include

#include

#include

#include

#include

#include

#include

#define msc(x) memset(x,-1,sizeof(x))

#define ms(x) memset(x,0,sizeof(x))

typedef

long

long ll;

using

namespace

std;

const

int inf=0x7fffffff;

int dp[102][102];

int main(int argc, char

const *argv)}}

else

if(type==1)}}

else}}

}if(dp[n][t]<0) puts("-1");

else

printf("%d\n",dp[n][t] );

}return

0;}

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 ...

hdu 3535 AreYouBusy 混合揹包

題意 有三種任務,至少完成乙個,至多完成乙個,任意完成。現在給出k組任務,每組任務都屬於三種任務的一種。每個任務都會消耗時間,獲得幸福感。求時間t內的最大滿足感。三種揹包的混合。還是考察對揹包問題的理解。顯然一維已經滿足不了要求了,我們設d k j 代表第k組容量為j時獲得的最大滿足感。可以明顯比較...

題解 hdu3535 混合揹包

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