題目大意:有 n 組任務,m 個體力,每組任務有 k 個,分類為 f,每個任務花費 x 體力,得到 y 開心值,求最大開心值,若不能完成輸出-1
分類為 0:這一組中的 k 個任務至少選擇乙個。
分類為 1:這一組中的 k 個任務最多選擇乙個。
分類為 2:這一組中的 k 個任務隨便選擇。
解法:對於 0 : 其實就是之前做過的分組揹包的變形每組至少選乙個
對於 1 : 其實就是分組揹包
對於 2 : 其實就是 01揹包
.對於分類 0,若當前判斷到乙個任務 x,則有兩種情況:
1)它是該組第乙個被選擇的任務,則它更新的狀態只能是將上一層的狀態轉移更新到當前位置。
2)它不是第乙個被選擇的任務,則它可以由當前組的狀態轉移更新到當前位置。
為了方便判斷處理第乙個任務,初始化當前層為 -inf
2.對於分類 1,因為只能選乙個或者不選,則它只能由上一層狀態轉移更新
3.對於分類 2,就是普通的 01揹包問題
#include #include#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
#define inf 0x3f3f3f3f
#define ls nod<<1
#define rs (nod<<1)+1
using
namespace
std;
int dp[250][250
];int w[250],v[250
];int
n,m,k,vv;
intmain()
}else
if(vv==1
)
else}}
int temp=max(dp[n][m],-1
); printf(
"%d\n
",temp);
}return0;
}
hdu 3535 AreYouBusy 混合揹包
題意 有三種任務,至少完成乙個,至多完成乙個,任意完成。現在給出k組任務,每組任務都屬於三種任務的一種。每個任務都會消耗時間,獲得幸福感。求時間t內的最大滿足感。三種揹包的混合。還是考察對揹包問題的理解。顯然一維已經滿足不了要求了,我們設d k j 代表第k組容量為j時獲得的最大滿足感。可以明顯比較...
混合揹包 分組揹包
啥是混合揹包呢,就是包含01揹包,完全揹包,多重揹包。有n件物品,揹包承重最大為m,w i 代表重量,v i 代表價值,s i 代表種類。s i 1,可用1次,s i 0,可用無限次,s i 0,可用s i 次.解法 見 const int maxn 1e4 5 int n,m,dp m 1 w n...
混合揹包問題
如果將p01 p02 p03混合起來。也就是說,有的物品只可以取一次 01揹包 有的物品可以取無限次 完全揹包 有的物品可以取的次數有乙個上限 多重揹包 應該怎麼求解呢?考慮到在p01和p02中給出的偽 只有一處不同,故如果只有兩類物品 一類物品只能取一次,另一類物品可以取無限次,那麼只需在對每個物...