忙碌 分組揹包

2021-10-06 23:05:32 字數 1780 閱讀 1101

題目描述

魔法世界歷史上曾發生過多次大規模滅絕戰爭。例如瘋狂**世界人口約2億人以至於榮登「健力士世界紀錄」的蒙帝國鐵騎軍,其幕後推手即是天頂星人。但在人類文明生死存亡之際,總會湧現出許許多多的英雄人物奮起抗爭,拯救人民於水火之中。

現在,抵禦天頂星人進攻的重任落在了魔法學院眾師生的肩上。這天墨老師安排了n組工作讓楚繼光完成,時間為t,每個工作組中有m個工作,每一組工作有個分類值為s,如s是0表示組內至少要做一件工作,如s是1表示組內最多做一件工作,s是2表示組內工作隨意完成,每項工作均有需花費的時間和獲得的快(tong)樂(ku)值,求楚繼光在t時間內可獲得的最大快樂值。

輸入格式

有多組測試資料,每組資料第一行有兩個整數n和t (0≤n,t≤100),表示有n組工作和時間t。隨後是n組描述,每組兩個數字m(0隨後是m對數字ci,gi (0≤ci,gi≤100),表示完成該工作需要的時間和獲得的快樂值。注意乙個工作只能做一次。

輸出格式

獲得的最大快樂值。若不能完成,則輸出「-1」。

樣例樣例輸入

3 3 

2 1 2 5 3 8

2 0 1 0 2 1

3 2 4 3 2 1 1 1

樣例輸出

這事一道分組揹包的板題,關鍵在於每組如何實施。設dp[i][j]表示第i組,容量 j 。

至少一件

我們可以將dp[i][j]先全賦成極小值,這樣他要選就必須從前一組的狀態中選取至少乙個,才能在本組狀態中選,從而保證至少乙個。

方程:dp[i][k]=max(max(dp[i][k],dp[i][k-a[j]]+b[j]),dp[i-1][k-a[j]]+b[j])

其中 i 第幾組,j 為當前組的第幾個,k 為容量。

至多一件

我們為了保證全域性最優同時保證至多一件,將上一組的狀態複製到當前組來,即dp[i][j]=dp[i-1][j]

然後再使當前組只能從上一組狀態轉移。

為什麼了?

因為當前組變成上一組的狀態後,從上一組狀態轉移就相當於只拿了一件(因為始終是從上一組來的,決策集合永遠只有兩個:取乙個或不取)

方程:dp[i][k]=max(dp[i][k],dp[i-1][k-a[j]]+b[j])

隨便取就相當於0/1揹包,需要注意還是要將上一組的狀態複製到當前組來,為了全域性最優。

#include

#include

#include

#include

#include

#include

#include

using namespace std;

const

int m=

105;

int a[m]

,b[m]

,dp[m]

[m*m]

,m,n;

intmain()

if(c==1)

if(c==2)

}if(dp[n]

[m]>=0)

printf

("%d\n"

,dp[n]

[m])

;else

printf

("-1\n");

}return0;

}

通天之分組揹包 分組揹包

本人水平有限,題解不到為處,請多多諒解 本蒟蒻謝謝大家 題目 傳送門 分組揹包的模板 偽 1 for int i 1 i 組數 i 6 7 直接套模板即可。code 1 include2 pragma gcc optimize 3 3const int n 1e5 10 4 using namesp...

混合揹包 分組揹包

啥是混合揹包呢,就是包含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...

揹包問題克星 分組揹包

有n件物品,告訴你這n件物品的重量以及價值,將這些物品劃分為k組,每組中的物品互相衝突,最多選一件,求解將哪些物品裝入揹包可使這些物品的費用綜合不超過揹包的容量,且價值總和最大。演算法 首先判斷乙個分組當中的一件物品,同01揹包一樣,此物品存在兩種狀態,取與不取,若取此物品,則繼續判斷下一組的第一件...