有n種物品,每件物品的重量為w[i],價值為v[i]。現有乙個容量為c的揹包,問如何選取物品放入揹包,使得揹包內物品的總價值最大。其中有些物品只能取一次,有些物品可以取有限多次,有些物品可以取無限次。
這題其實就是0/1揹包、完全揹包、多重揹包三種問題混合起來。
對每種物體進行一次判斷,選擇對應的狀態轉移方程即可
這三種揹包問題的分析→揹包問題(1)
#includeusingnamespace
std;
#define max_capaticy 100
#define max_quantity 100
int w[max_quantity+2];///
物品重量
int v[max_quantity+2];///
物品價值
int m[max_quantity+2];///
第i種物品的件數,輸入0表示無限件
int dp[max_quantity+2];///
使用一維陣列
int c,n;///
揹包容量和物品數量
intmain()
for(int i=1;i<=n;++i)
}else
dp[j]=max(dp[j],dp[j-num*w[i]]+num*v[i]);}}
}cout
<}
return0;
}
對於每件物品,具有兩種不同的費用;選擇這件物品必須同時付出這兩種代價;對於每種代價都有乙個可付出的最大值。問怎樣選擇物品可以得到最大的價值。設這兩種代價分別為代價1和代價2,第i件物品所需的兩種代價分別為a[i]和b[i]。兩種代價可付出的最大值分別為v和u。物品的價值為v[i]。
二維揹包和0/1揹包很像,只是加了乙個費用條件
只需要多開一維陣列來儲存
#includeusingnamespace
std;
#define max_capaticy 100
#define max_quantity 100
int a[max_quantity+2];///
物品代價一
int b[max_quantity+2];///
物品代價二
int v[max_quantity+2];///
物品價值
int dp[max_quantity+2][max_quantity+2];///
增加一維費用
int u,v,n;///
揹包代價一最大值、代價二最大值和物品數量
intmain()
for(int i=1;i<=n;++i)}}
cout
}return0;
}
有n件物品和乙個最大承重為c的揹包,已知這n件物品的重量w[i]以及價值v[i],將這些物品劃分為k組,每組中的物品互相衝突,最多選一件,求解將哪些物品裝入揹包可使這些物品的費用綜合不超過揹包的容量,且價值總和最大。
模擬0/1揹包,分組揹包多了分組
對於每件物品還是兩種選擇,選或是不選
先對第一組第乙個進行判斷,選擇的話就對下一組第乙個進行判斷,不選擇就對本組下乙個進行判斷
#includeusingnamespace
std;
#define max_capaticy 100
#define max_quantity 100#include
int w[max_quantity+2];///
物品重量
int v[max_quantity+2];///
物品價值
vector g[max_quantity+2];///
物品所在小組
int dp[max_quantity+2];///
使用一維陣列
int c,n,t;///
揹包容量、物品數量和小組總數
int p;///
物品所在小組
intmain()
for(int i=1;i<=t;++i)}}
}cout
}return0;
}
揹包問題2(完全揹包)
問題的提出 有n種物品,乙個容量為v的揹包,每種物品可以無限的加入揹包,第i種物品的價值為v i 花費為w i 求將那些裝入揹包能讓價值最大且不超過揹包的容量?思路 該題類似於01揹包,唯一的不同就是所有的物品可以無限取,這樣從物品的角度考慮就會有多中方法,不像01中的取或不取 當然01揹包作為最基...
揹包問題2 完全揹包
一,題目 有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的費用是c i 價值是w i 求解將哪些物品裝入 揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。二,基本思路 從每種物品的角度考慮,與它相關的策略已並非取或不取兩種,而是有取0件 取1件 取2件 等很多種。令f ...
揹包問題2
設f i,x 表示前i件物品,揹包容量為x時的最大價值,那麼轉移式可以表示為f i,x max f i 1,x w i c i f i 1,x 那麼f n,m 即為最優解。其實整體思想則表示為從容量為1的開始計算並且後面的計算不斷的使用前面已經計算的值,這樣就可以避免重複計算。code includ...