金明的預算方案

2021-09-05 10:17:35 字數 2155 閱讀 7210

題解:帶有附件的揹包問題,它屬於01揹包的變式。

這題還好,每乙個物品最多只有兩個附件,那麼我們在對主件進行揹包的時候,決策就不再是兩個了,而是五個。

還記得01揹包的決策是什麼嗎?

1.不選,然後去考慮下乙個

2.選,揹包容量減掉那個重量,總值加上那個價值。

這個題的決策是五個,分別是:

1.不選,然後去考慮下乙個

2.選且只選這個主件

3.選這個主件,並且選附件1

4.選這個主件,並且選附件2

5.選這個主件,並且選附件1和附件2.

這個。。。很好想吧。。。

我們知道,01揹包的狀態轉移方程(已使用滾動陣列優化)是f[j] = max(f[j],f[j-w[i]]+c[i]),那麼,這道題的轉移方程也就不難寫出了。

等等,你得先判斷某個選附件的決策是不是可行的,如果當前的容量還夠放第乙個,或第二個,或兩個都選的附件,那麼才能考慮轉移。

當然,不選附件的話就不用判啦,直接01揹包的轉移方程即可。

我們令main_item_w陣列表示某個主件的費用,而main_item_c陣列表示某個主件的價值。

同樣的,用二維陣列annex_item_w表示某個附件的費用,annex_item_c表示某個附件的價值,第二維只需要0,1,2這三個數,其中第二維是0的場合表示這個主件i的附件數量,它只能等於0或1或2。第二維是1或者是2的值代表以i為主件的附件1或者附件2的相關資訊(費用 價值)。這些陣列的資訊應該在讀入時處理好,具體詳見**。

這樣,狀態轉移方程就是四個。

不選附件的①:f[j] = max(f[j],f[j-main_item_w[i]]+main_item_c[i]);

選附件1的②:f[j] = max(f[j],f[ j - main_item_w[i] - annex_item_w[i][1] ] + main_item_c[i] + annex_item_c[i][1]);

選附件2的③:f[j] = max(f[j],f[ j - main_item_w[i] - annex_item_w[i][2] ] + main_item_c[i] + annex_item_c[i][2]);

選附件1和附件2的④:f[j] = max(f[j],f[ j - main_item_w[i] - annex_item_w[i][1] - annex_item_w[i][2] ] + main_item_c[i] + annex_item_c[i][1] + annex_item_c[i][2]);

已經滾動掉了第一維,道理和正常向的01揹包都是一樣的,即只有i和i-1有關係,但是這個規律在迴圈中已經滿足了所以完全沒必要記錄。

目標狀態f[n],輸出就好。

/*

*@author: stzg

*@language: c++

*/#include #include#include#include#include#include#include#include#include#include#include#include#include#include#include#include//#define debug

#define ri register int

using namespace std;

typedef long long ll;

typedef __int128 lll;

const int n=32000+1000;

const int mod=1e9+7;

const double pi = acos(-1.0);

const double exp = 1e-8;

const int inf = 0x3f3f3f3f;

int t,n,m,k,q,v,p;

int mw[n];

int mc[n];

int aw[n][3];

int ac[n][3];

int f[n];

int main()

else

}for (int i=1;i<=m;i++)

for (int j=n;mw[i]!=0 && j>=mw[i];j--)

cout << f[n] << endl;

//cout << "hello world!" << endl;

return 0;

}

金明的預算方案

problem description 金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間金明自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只有不超過n元錢就行 今天一早,金明就開始做預算了,他把想買的物品分為兩類 主件和附件,附件是從屬...

金明的預算方案

題目描述 金明今天很開心,媽媽昨天對他說 你的房間需要購買哪些物品,你說了算,只要不超過n元錢就行 今天一早,金明就開始做預算了,他把想買的物品分為兩類 主件與附件,附件是從屬於某個主件的,下表就是一些主件與附件的例子 主件 附件 電腦 印表機,掃瞄器 書櫃 圖書 書桌 檯燈,文具 工作椅 無 如果...

金明的預算方案

題目 分析一下,若想選附件,必然要選其主件,看上去是個依賴揹包問題,也就是樹形dp,但是這個題目限制了乙個問題,也就是乙個主件至多有2個附件,那麼也就只有4種方案,只選主件,選主件和附件1,選主件和附件2,選主件和附件1和附件2。只有4種方案,所以將其轉化成為乙個組合揹包問題。include inc...