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

2021-08-06 05:12:47 字數 2383 閱讀 1323

01揹包和完全揹包的區別:

01揹包的侷限在於每樣物品只有一種,每個物品都有乙個屬於自己的價值和重量,在給定的物品中選出揹包所能容納的最大重量,要求是價值最大;

完全揹包與01揹包的不同在於完全揹包不限制每樣物品的個數,物品的價值和質量都與01揹包一樣,也同樣是求在給定大小的容量中,找出最大價值的選擇;

多重揹包就是介於01揹包和完全揹包之間,物品不是無限也不是乙個,而是大於等於乙個,多重揹包問題可以轉換成01揹包問題,比如01揹包中有1個a,多重揹包裡有5個a,那不就是在01揹包中有5個相同的a嘛,還還有乙個改進方式,比有13個a,可以把13 轉化成1+2+4+6=13,物品也轉化成四個物品:a,2a,4a,6a,價值也乘以倍數,這四個物品之間搭配都能得出1-13之間的物品數和價值,但是13個物品需要迴圈13次,而4個只需四次,具體轉化公式是1,2,4,2^(k-1) , n-2^k+1;

解釋:

為了不讓選過的物品再次被選,也就是01揹包問題,可以用對揹包的重量從最大(你所需要求的重量)開始減小到1,二個迴圈,乙個是外迴圈 i 是物品重量,乙個內迴圈 j 揹包的重量 , 因為是逆序賦值,而重量也是逆序,所以dp[j-w[i]]+val[i],j-w[i]就是當時的重量減去這個物品的重量,在前面去找這個重量的價值,再加上val[i],新物品的價值,比較大小得出更高的,在前面找重量這個過程由於是逆序的所以不是沒有賦值就是 上一次的資料,所以不會有重複的;

而完全揹包就是順過來,可以重複;

01揹包題目:

01揹包**:

#include 

using

namespace

std;

int w[105], val[105];

int dp[1005];

int main()

for(int i=1; i<=m; i++) //物品

for(int j=t; j>=0; j--) //容量,逆序

cout

<< dp[t] << endl;

return

0;}

完全揹包題目:

完全揹包**:

#include

#include

#define inf 10000000

long

long min(long

long s,long

long v)

int main()

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

c[i]=inf;

c[0]=0;

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

for(int j=val[i];j<=big;j++)//順序

if(c[big]>=inf)

printf("this is impossible.\n");

else

printf("the minimum amount of money in the piggy-bank is %d.\n",c[big]);

}return

0; }

多重揹包題目:

多重揹包**1:

#include 

#include

using

namespace

std;

int w[2000], val[2000];

int dp[2000];

int max(int q,int p)

int main()

// while(dp[t]==0)

// t--;

cout

<< dp[t] << endl;}

return

0;}

多重揹包**2(改進):
#include 

#include

#include

using

namespace

std;

int w[2000], val[2000];

int dp[2000];

int max(int q,int p)

int main()

if(sum// for(int i=1;i<=u-1;i++)

// coutfor(int i=1; i<=u-1; i++) //物品

for(int j=t;j>=0; j--) //容量,逆序

// while(dp[t]==0)

// t--;

cout

<< dp[t] << endl;}

return

0;}

揹包問題(01揹包,完全揹包,多重揹包)

揹包問題 01揹包,完全揹包,多重揹包 近日為以下瑣事煩身 差不多要向學院提交專案申請了,本來是想做個多模式的im系統的,可是跟往屆通過審核的專案比起來,缺乏創新和研究價值,所以在文件上要多做手腳,花點心思。揹包問題,經典有揹包九講。不死族的巫妖王發工資拉,死亡騎士拿到一張n元的鈔票 記住,只有一張...

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

有goods num件物品,max volume的最大裝載量,每種物品只有一件,每種物品都有對應的重量或者說體積volume i 價值value i 求解裝包的最大價值 假設目前已經有 i 1件物品裝在容量為 j 的揹包中,並且得到最大價值package i 1 j 當前裝第i件,那麼討論分兩個角度...

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

0 1揹包問題是指每一種物品都只有一件,可以選擇放或者不放。jj w i v i,j max v i 1,j v i 1,j w i v i for int i 0 i n i 初始化第0列 v i 0 0 for int j 0 j c j 初始化第0行 v 0 j 0 for int i 1 i...