hdu 3535 揹包綜合題)

2021-09-06 09:51:34 字數 1107 閱讀 9123

一道需要深刻理解狀態轉移的揹包題:dp[i][j],表示第i組,時間剩餘為j時的快樂值。每得到一組工作就進行一次dp,所以dp[i]為第i組的結果。

1、至少選一項,即必須要選,那麼在開始時,對於這一組的dp的初值,應該全部賦為負無窮,這樣才能保證不會出現都不選的情況。狀態轉移方程為dp[i][k]=max。dp[i][k]是不選擇當前工作;dp[i-1][k-cost[j]]+val[j]是選擇當前工作,但是是第一次在本組中選,由於開始將該組dp賦為了負無窮,所以第一次取時,必須由上一組的結果推知,這樣才能保證得到全域性最優解;dp[i][k-cost[j]]+val[j]表示選擇當前工作,並且不是第一次取。

2、最多選一項,即要麼不選,一旦選,只能是第一次選。所以狀態轉移方程為dp[i][k]=max。由於要保證得到全域性最優解,所以在該組dp開始以前,應該將上一組的dp結果先複製到這一組的dp[i]陣列裡,因為這一組的資料是在上一組資料的基礎上進行更新的。

3、任意選,即不論選不選,選幾次都可以,顯然狀態轉移方程為dp[i][k]=max。同樣要保證為得到全域性最優解,先複製上一組解。

1 #include2 #include3 #include4 #include5

using

namespace

std;

6#define maxn 111

7#define inf 1<<30

8int dp[maxn][maxn];//

dp[i][j]表示第i組,時間剩餘為j時的快樂值。

9int

w[maxn],value[maxn];

10int

n,v,m,flag;

1112

intmain()

20if(flag==0)27

}28 }else

if(flag==1)35

}36 }else43}

44}45}

46int ans=max(dp[n][v],-1

);47 printf("

%d\n

",ans);48}

49return0;

50 }

view code

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

題解 hdu3535 混合揹包

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

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