題意:給3種揹包,一種是至少裝乙個,一種是最多裝乙個,一種任意。
首先要對一維狀態的原始揹包很熟悉才可以。此處的i代表滾動的揹包型別。
1. 任意的話就是01揹包 初始化:dp[i][j]=dp[i-1][j]. dp[i][j]=max dp[i][j-w[i]] 存在.
2. 最多裝乙個,就是比較替換。初始化:dp[i][j]=dp[i-1][j]. dp[i][j]=max dp[i-1][j-w[i]] 存在
3. 至少裝乙個,先保證裝,要麼替換要麼裝入 初始化:dp[i][j]=-1.
if(dp[i][k-w]!=-1) dp[i][k]=max(dp[i][k],dp[i][k-w]+v);//如果dp[i][k-w]存在,則表示i組已經取過了,就相當與在去過的基礎上再取,即,至少乙個
if(dp[i-1][k-w]!=-1) dp[i][k]=max(dp[i-1][k-w]+v,dp[i][k]);//保證一定取乙個
#include#includeint dp[110][110];
int max(int a,int b)
int main()}}
if(s==1)//至多選乙個}}
if(s==2)//隨意選}}
} int ans=-1;
for(i=0;i<=t;i++)
printf("%d\n",ans);
} return 0;
}
hdu 3535 揹包綜合題)
一道需要深刻理解狀態轉移的揹包題 dp i j 表示第i組,時間剩餘為j時的快樂值。每得到一組工作就進行一次dp,所以dp i 為第i組的結果。1 至少選一項,即必須要選,那麼在開始時,對於這一組的dp的初值,應該全部賦為負無窮,這樣才能保證不會出現都不選的情況。狀態轉移方程為dp i k max。...
題解 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...