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...