題意:有0,1,2三種任務,0任務中的任務至少得完成一件,1中的任務最多完成1件,2中的任務隨便做。每乙個任務最多只能做一次 。n代表有n組任務,t代表有t分鐘,m代表這組任務有m個子任務,s代表這m個子任務屬於0,1,2中的哪種型別,接下來是m個子任務,第乙個數代表要花費的時間,第二個數代表得到的愉悅度......求在可以完成工作的情況的最大愉悅度....要是不能完成,輸出-1(題意要求每個子任務只能被取一次)
錯誤思路:我一開始想,把0,1,2這三大組任務的子任務先統計好,在dp的時候,我開dp[3][105],代表在完成3組任務體積為105的情況的最大愉悅度.......這種思路是錯的,因為題目給出的n組任務是有其固定順序,只能是按照它給出來的解決問題.......
ac思路:分為n組,每一組判斷這一組是屬於0,1,2三種任務中的哪一組......
若是屬於0,那麼將這一組的dp[i][j],j從0~~t全部置為負無窮大,然後開始動態轉移.....為什麼要置為負無窮大?因為只有這樣才能不出現乙個都不選擇的情況.....其動態轉移方程,,在我前乙個分組揹包題目已經詳細推導過,就是dp[i][j]=max(dp[i][j-v[i]]+val[i],dp[i-1][j-v[i]]+val[i],dp[i][j])
若是屬於1,先將第i-1的狀態傳遞到第i狀態,在開始分組揹包的模板......最多取乙個dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]]+val[i]);
若是屬於2,先將第i-1的狀態傳遞到第i狀態,隨意取,那麼可以不取,取任意個子任務......dp[i][j]=max(dp[i-1][j],dp[i][j-v[i]]+val[i],dp[i-1][j-v[i]]+val[i]);
#include#include#includeusing namespace std;#define m -1000000000
int dp[105][105],s[105][2];
int main()}}
else if(k==1) //最多取乙個 ,分組揹包模板 }}
}else if(k==2) //隨意取 ,01揹包,每個子任務只能取一次,卻可以取任意個不同的子任務 }}
}if(dp[n][t]<0)
printf("-1\n");
else
printf("%d\n",dp[n][t]);
}return 0;
}
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...
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組的結果。下面對三種情況進行...