揹包問題 多重揹包

2021-07-31 08:16:15 字數 1653 閱讀 9872

有n種物品和乙個容量為w的揹包。第i種物品最多有n[i]件可用,每件重量是w[i],價值是v[i]。求解將哪些物品裝入揹包可使這些物品的重量總和不超過揹包容量,且價值總和最大。

1.使用三重迴圈進行遞推:

狀態轉移式為:dp[i][j]=max

關鍵**如下:

void solve()}}

printf("%d\n",dp[n][w]);

}

然而複雜度為o(v*σn[i]),效率太低。

2.轉換為01揹包

即把第i種物品換成n[i]件01揹包中的物品,這樣就轉換為求σn[i]的01揹包問題,複雜度仍為o(v*σn[i])。

**如下:

#include

#include

using

namespace

std;

const

int maxn = 100+10;

const

int max_n = 1000000;

int w[maxn], v[maxn], a[maxn];

int w_n[max_n], v_n[max_n];

int dp[max_n];

int n, w;

int k;

/*01揹包*/

void solve()

}printf("%d\n",dp[w]);

}int main()

將第i種物品分成若干件物品,其中每件物品有乙個係數,這件物品的重量和價值均是原來的重量和價值乘以這個係數。使這些係數分別為1,2,4,…,2^(k-1),n[i]-2^k+1,且k是滿足n[i]-2^k+1>0的最大整數。例如,如果n[i]為13,就將這種物品分成係數分別為1,2,4,6的四件物品。

這樣就將第i種物品分成了o(log n[i])種物品,將原問題轉化為了複雜度為o(v*σlog n[i])的01揹包問題。

——摘自《揹包九講》

這就是二進位制法。

**如下:

#include

#include

using

namespace

std;

const

int maxn = 100+10;

int n,w;

int w[maxn], v[maxn], a[maxn];

int dp[maxn];

/*01揹包*/

void zero_pack(int w, int v)

}/*完全揹包*/

void comp_pack(int w, int v)

}/*多重揹包*/

void mult_pack(int w, int v, int a)

int k = 1;

while(k < a)

//剩餘的再需要一次01揹包

zero_pack(a*w, a*v);

}int main()

for(int i=0; iprintf("%d\n",dp[w]);

return

0;}

多維多重揹包問題 01揹包,完全揹包,多重揹包

csdn 專業it技術社群 登入 blog.csdn.net有n件物品和乙個容量為v的揹包。第i件物品的費用是w i 價值是v i 求將哪些物品裝入揹包可使價值總和最大。1.1空間優化 這要求在每次主迴圈中我們以 v v 0 的遞減順序計算 f v 這樣才能保證計算 f v 時 f v ci 儲存的...

多維多重揹包問題 多重揹包問題

悼念512汶川大 遇難同胞 珍惜現在,感恩生活 急!災區的食物依然短缺!為了挽救災區同胞的生命,心繫災區同胞的你準備自己採購一些糧食支援災區,現在假設你一共有資金n元,而市場有m種大公尺,每種大公尺都是袋裝產品,其 不等,並且只能整袋購買。請問 你用有限的資金最多能採購多少公斤糧食呢?後記 人生是乙...

揹包問題 01揹包 完全揹包 多重揹包

01揹包和完全揹包的區別 01揹包的侷限在於每樣物品只有一種,每個物品都有乙個屬於自己的價值和重量,在給定的物品中選出揹包所能容納的最大重量,要求是價值最大 完全揹包與01揹包的不同在於完全揹包不限制每樣物品的個數,物品的價值和質量都與01揹包一樣,也同樣是求在給定大小的容量中,找出最大價值的選擇 ...