揹包問題2

2021-07-27 05:24:22 字數 1674 閱讀 9696

設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:

#include

#include

using

namespace

std;

int dp[500][500],w[500],c[500];

int main(void)

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

else dp[i][j]=dp[i-1][j];}}

cout

《還有一道貨幣系統問題,即已知貨幣系統有v種面值,求組成面值n的貨幣有多少種方案?

【樣例輸入】

3(v) 10(n)

1 2 5(各種面值大小)

【輸出樣例】

10題解

主要思想就是另創乙個陣列,每讀入一種面值對其進行不斷加,最後看陣列下標為n的大小即為ans。讓陣列在迴圈體中滾動運算。

code

#include

#include

using

namespace

std;

int f[1000];

int main(void)

}cout

《補上一次簡單揹包中的一題

數字分組ural 1005

將一組數分成兩組,讓他們的和之差最小,求最小值。

【輸入樣例】

5 1 2 3 4 5

【輸出樣例】

1題解:

其實這題轉換一下思路就可以化簡為之前用過的裝箱問題。即從n個物品中選若干個,求重量小於sum/2的最大值。

code

#include

#include

using

namespace

std;

int f[1000],dp[1000];

int main(void)

max=sum/2;

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

dp[f[i]]=1;

}for(int i=max;i>=0;i--)

}}

最後是完全揹包問題,其實如果0/1揹包理解的話那這個就很好理解了

題目同0/1揹包問題,唯一不同的地方是每種物品都有無限多個,求可以獲得的最大值

題解

因為0/1揹包有個數限制所以for迴圈是按照物品來的,而該題沒有這個限制故按照包的大小來計算

code:

#include

#include

using

namespace

std;

int w[5000],c[5000],dp[5000];

int main(void)

for(int i=1;i<=m;i++)}}

cout

<}

揹包問題2(完全揹包)

問題的提出 有n種物品,乙個容量為v的揹包,每種物品可以無限的加入揹包,第i種物品的價值為v i 花費為w i 求將那些裝入揹包能讓價值最大且不超過揹包的容量?思路 該題類似於01揹包,唯一的不同就是所有的物品可以無限取,這樣從物品的角度考慮就會有多中方法,不像01中的取或不取 當然01揹包作為最基...

揹包問題2 完全揹包

一,題目 有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的費用是c i 價值是w i 求解將哪些物品裝入 揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。二,基本思路 從每種物品的角度考慮,與它相關的策略已並非取或不取兩種,而是有取0件 取1件 取2件 等很多種。令f ...

揹包問題2

1268 例9.12 完全揹包問題 時間限制 1000 ms 記憶體限制 65536 kb 提交數 10068 通過數 5384 題目描述 設有nn種物品,每種物品有乙個重量及乙個價值。但每種物品的數量是無限的,同時有乙個揹包,最大載重量為mm,今從nn種物品中選取若干件 同一種物品可以多次選取 使...