帶有附件的揹包問題,它屬於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元錢就行 今天一早,金明就開始做預算了,他把想買的物品分為兩類 主件與附件,附件是從屬於某個主件的,下表就是一些主件與附件的例...