金明的預算方案 01揹包的變式

2021-09-25 11:59:23 字數 1346 閱讀 6737

帶有附件的揹包問題,它屬於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]),那麼,這道題的轉移方程也就不難寫出了。

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

選附件1的②:f[j] = max(f[j],f[ j - v0[i] - v1[i] ] + w0[i] + w1[i]);

選附件2的③:f[j] = max(f[j],f[ j - v0[i] - v2[i] ] + w0[i] + w2[i]);

選附件1和附件2的④:f[j] = max(f[j],f[ j - v0[i] - v1[i] - v2[i] ] + w0[i] + w1[i] + w2[i]);

#include#include#include#includeusing namespace std;

typedef long long ll;

const int inf = 0x3f3f3f3f;

#define mp make_pair

#define pb push_back

#define fi first

#define se second

const int n = 4 * 1e4 + 5;

typedef struct nodenode;

node node[65];

paira[65][4];

int dp[n];

int n,m;

int main()

memset(a,-1,sizeof(a));

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

}memset(dp,0,sizeof(dp));

int max = -1;

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

printf("%d\n",max);

return 0;

}

金明的預算方案 01揹包

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

金明的預算方案 揹包問題

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

金明的預算方案 樹形揹包

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