有依賴的揹包

2021-10-22 08:54:47 字數 907 閱讀 8271

關鍵:當遞迴處理u結點的子樹返回時,進行分組揹包的決策,各個子樹中的結點可能非常多,可能有100多個結點,因此,如果以方案來劃分最多有2^100種類別,所以要改用體積來劃分

從j表示當前除去v[u]的體積,j從[ m - v [u] , 0 ]的體積中列舉(類別),k選取體積是0,是1......是j(選乙個)——>轉化為分組揹包問題

轉移方程為:dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[son][k])

物品組選完以後,再將u結點如,此時需要列舉揹包剩餘體積

1.對於j>=v[u]&&j<=m的體積,可以裝入u結點,更新相應的dp陣列

2.對於j#include #include using namespace std;

const int n=110;

int n,m;

int h[n],e[n],idx,ne[n];

int v[n],w[n];

int dp[n][n];//表示在所有以u為根的子樹中選,且總體積不超過j

void add(int a,int b)

void dfs(int u)

//在體積為j時,再將當前u加進去

//相應更新dp陣列

for(int j=m;j>=v[u];j--)dp[u][j]=dp[u][j-v[u]]+w[u];

for(int j=0;j>n>>m;

memset(h,-1,sizeof h);

for(int i=1;i<=n;i++)

dfs(root);

cout<

分組揹包,混合揹包,有依賴的揹包

一.分組揹包 每組只能選乙個 所謂分組揹包,就是把物品分成n組,每組裡面m個物品,從這n組中每組選乙個物品,使得在揹包體積是v的條件下價值最大 思路 對於每一組由於只能選乙個,所以就是決策這一組中選哪乙個獲得的價值最大 for int i 1 i n i 列舉這是第幾組 num i 代表第i組物品的...

有依賴揹包 預算

張琪曼等人要為太空戰指揮中心購置裝置,魔法學院的院長昨天說 指揮中心需要購買哪些裝置,你們研究了算,只要不超過n元錢就行 所以今天一早,張琪曼就開始做預算了,她把想買的物品分為兩類 主件與附件,附件是從屬於某個主件的,下表就是一些主件與附件的例子 如果要買歸類為附件的物品,必須先買該附件所屬的主件。...

有依賴的揹包問題

簡化的問題 這種揹包問題的物品間存在某種 依賴 的關係。也就是說,i依賴於j,表示若選物品i,則必須選物品j。為了簡化起見,我們先設沒有某個物品既依賴於別的物品,又被別的物品所依賴 另外,沒有某件物品同時依賴多件物品。演算法 這個問題由noip2006金明的預算方案一題擴充套件而來。遵從該題的提法,...