定義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,dp[i-1][k-weight]+val))。仔細想想,因為初始化為-inf,所以第一次從dp[i-1]轉移過來一定選中了第i組的一件物品。
s == 1,至多選乙個。這就變成了普通的01揹包問題。從上乙個狀態轉移過來。
s == 2,隨便選。這類似於完全揹包問題。
#include using namespace std;
int const inf = 0x3f3f3f3f;
int const n = 100 + 10;
int n,m,s,t,weight,val;
int dp[n][n]; //dp[i][j]表示考慮到第i組,容量為j的最大價值
int main()
}else if(s == 1)
}else
}} printf("%d\n",dp[n][t] < 0 ? -1:dp[n][t]);
} 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 ...
dp之分組揹包hdu3535(推薦)
題意 有0,1,2三種任務,0任務中的任務至少得完成一件,1中的任務最多完成1件,2中的任務隨便做。每乙個任務最多只能做一次 n代表有n組任務,t代表有t分鐘,m代表這組任務有m個子任務,s代表這m個子任務屬於0,1,2中的哪種型別,接下來是m個子任務,第乙個數代表要花費的時間,第二個數代表得到的愉...
題解 hdu3535 混合揹包
題目鏈結 思路摘抄自大佬部落格 首先如果存在最優解,我們可以互換不同工作集合的處理順序,依然能得到最優解.那麼我們下面只需要處理每個單獨的工作集合即可.令dp i j x表示處理完前i組工作集,所花時間 j時的快樂值為x。每得到一組工作就進行一次dp,所以dp i 為第i組的結果。下面對三種情況進行...