這類問題是01揹包的變形。所有的物品分為兩類,一類是主件,另一類是附件,每乙個附件都有它的主件,選取它的主件之後才能選取附件。
【問題描述】
金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間金明自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說:「 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過 n元錢就行 」。今天一早,金明就開始做預算了,他把想買的物品分為兩類:主件與附件,附件是從屬於某個主件的,下表就是一些主件與附件的例子:
設第 j件物品的**為 v[j],重要度為 w[j],共選中了 k件物品,編號依次為 j1,j2,⋯⋯,jk,則所求的總和為:v[j1]×w[j1]+v[j2]×w[j2]+⋯+v[jk]×w[jk]請你幫助金明設計乙個滿足要求的購物單。
【輸入檔案】
輸入檔案 budget.in 的第
1行,為兩個正整數,用乙個空格隔開:n m(其中 n(<32000)表示總錢數,m(<60)為希望購買物品的個數)從第 2行到第 m+1行,第 j行給出了編號為 j−1的物品的基本資料,每行有 3個非負整數v p q其中 v表示該物品的**(v<10000),p表示該物品的重要(1∼5),q表示該物品是主件還是附件。如果 q=0,表示該物品為主件,如果q>0,表示該物品為附件,q是所屬主件的編號)
【輸出檔案】
輸出檔案 budget.out 只有乙個正整數,為不超過總錢數的物品的**與重要度乘積的總和的最大值(<200000)。
我們找到這道題目的一句關鍵句:每乙個主件至多有2個附件。也就是說我們在判斷乙個主件的時候有這幾種方法:
什麼都不選
只選主件
主件+附件1
主件+附件2
主件+附件1+附件2
五種方法。
就這樣吧。
#include
using
namespace
std;
inline
int read()
const
int maxn=100;
int n,m,val[maxn][3],imp[maxn][3];
void init()
else
else
}//每個主件只會有兩個附件
}}int f[maxn][70000];//這裡第二維要開得大一點。。我找了好久錯誤哦
void dp()
else
f[i][j] = f[i-1][j];
//不選主件}}
printf("%d\n",f[m][n]);
}int main()
有依賴的揹包問題(樹形dp 揹包問題)
acwing 10.有 n 個物品和乙個容量是 v 的揹包。物品之間具有依賴關係,且依賴關係組成一棵樹的形狀。如果選擇乙個物品,則必須選擇它的父點。如下圖所示 如果選擇物品5,則必須選擇物品1和2。這是因為2是5的父節點,1是2的父節點。每件物品的編號是 i,體積是 vi,價值是 wi,依賴的父節點...
DP 揹包系列問題 有依賴的揹包問題
有依賴的揹包問題又是乙個經典的揹包延伸問題,理解她可以讓我們更深刻地理解揹包中三重迴圈的順序邏輯,同時她也是樹形動規的雛形。題目一般情形 有 n nn 個物品和乙個容量是 v vv 的揹包。物品之間具有依賴關係,且依賴關係組成一棵樹的形狀。如果選擇乙個物品,則必須選擇它的父節點。每件物品的編號是 i...
有依賴的揹包問題
簡化的問題 這種揹包問題的物品間存在某種 依賴 的關係。也就是說,i依賴於j,表示若選物品i,則必須選物品j。為了簡化起見,我們先設沒有某個物品既依賴於別的物品,又被別的物品所依賴 另外,沒有某件物品同時依賴多件物品。演算法 這個問題由noip2006金明的預算方案一題擴充套件而來。遵從該題的提法,...