題目鏈結
思路摘抄自大佬部落格
首先如果存在最優解, 我們可以互換不同工作集合的處理順序, 依然能得到最優解. 那麼我們下面只需要處理每個單獨的工作集合即可.
令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...