題解 hdu3535 混合揹包

2021-08-22 19:39:23 字數 1069 閱讀 9059

題目鏈結

思路摘抄自大佬部落格

首先如果存在最優解, 我們可以互換不同工作集合的處理順序, 依然能得到最優解. 那麼我們下面只需要處理每個單獨的工作集合即可.

令dp[i][j]==x表示處理完前i組工作集,所花時間<=j時的快樂值為x。每得到一組工作就進行一次dp,所以dp[i]為第i組的結果。下面對三種情況進行討論。

1.該集合內至少要選1件工作時. 要保證至少選1個第i類工作, 可以從第i-1類的結果dp[i-1]來更新dp[i].也可以用 01揹包的思想, 從本類的前乙個工作更新後乙個工作.

初始化:dp[i]全為負無窮.(即-inf)

狀態轉移方程為:

dp[i][k]=max

2.該集合內最多選1件工作時. 只能從上一層的結果dp[i-1]來更新dp[i]了.(想想為什麼)

初始化:dp[i]==dp[i-1].狀態轉移方程為dp[i][k]=max.

3. 該集合內工作可以隨便選. 這就是1個普通的01揹包問題了.

初始化:dp[i]==dp[i-1].

狀態轉移方程為:

dp[i][k]=max

最終所求:dp[n][t]的值

#include

#include

#include

using

namespace

std;

#define inf 0x3f3f3f3f

int n;//n組工作

int t;//t分鐘

int dp[110][110];//處理前i組工作,所花時間<=j的幸福點

int cost[110];//成本

int val[110];//幸福點

int main()

}else

if(s==1)//至多選1個的01揹包問題

}else

if(s==2)//隨便選的01揹包

}int ans=max(dp[n][t],-1);

printf("%d\n",ans);

}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 揹包綜合題)

一道需要深刻理解狀態轉移的揹包題 dp i j 表示第i組,時間剩餘為j時的快樂值。每得到一組工作就進行一次dp,所以dp i 為第i組的結果。1 至少選一項,即必須要選,那麼在開始時,對於這一組的dp的初值,應該全部賦為負無窮,這樣才能保證不會出現都不選的情況。狀態轉移方程為dp i k max。...

HDU3535 分組揹包

定義dp i j 為考慮到第i組,揹包容量為j時的最大價值 s 0,至少選乙個。那麼dp i 初始化為 inf。dp i k 要從dp i k weight val和dp i 1 k weight val轉移過來。所以dp i k max dp i k max dp i k weight val,d...