一道需要深刻理解狀態轉移的揹包題: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 #include5view codeusing
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 }
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...