動態規劃之0 1揹包問題

2021-08-21 09:47:20 字數 1423 閱讀 5847

最優解集合為

放入乙個容量為v的揹包獲得的最大價值。現在我們來找出遞推公式,對於第i件物品,有兩種選擇,放或者不放。

#include

#include

#include

using

namespace

std;

const

int maxn =

100;

intmain

()

}

for(

int i =

1; i <= n; ++i)

cin>>w[i]>>p[i];

for(

int i =

1; i <= n; ++i)

}cout

}return

0;

}

由此我們可以知道,我們必須要做出n次選擇,所以外層n次迴圈是必不可少的,對於上面**的內層迴圈,表示當第i個商品要放入容量為v(v = w[i]....v)的揹包時所獲得的價值,即先對子問題求解,這個也是必不可少的,所以時間複雜度為o(nv),這個已不能進一步優化,但是我們可以對空間進行優化。

事實上第i次選擇時,我們雖用到前i-1次的最優結果,但是前i-1次選擇的最優結果,已經儲存在做出第i-1次選擇後的結果中,即

第i次的結果只用到了第i-1次選擇後的狀態

,因此我們可以只用一維陣列來維持每次選擇的結果,怎麼維持?也就是當第i次選擇時,我們怎麼得到f[i-1][v]和f[i-1][v-w[j]]這兩種狀態,即

第i次求f[v]時,此時f[v]和f[v-w[i]]表示的是不是f[i-1][v]和f[i-1][v-w[j]]

,事實上我們只需要將內層迴圈

變為從v到w[j]的逆向迴圈

即可滿足要求。這句話不是很好理解,我們先給出優化後的**,然後由圖表來慢慢分析。

#include

#include

#include

#include

using

namespace

std;

const

int maxn =

100;

intmain

()

}

cout

}return

0;

}

例,有3個物品,揹包容量為10,如下:

初始時:我們初始化f全部為0

max = 

max = max = 4;

f[6] = max = max = 8

//此時我們用的f[6]和f[3]相當於是f[1][6]和f[1][3],而不是f[0][6]和f[0][3]!

f[7] = max = max = 8

動態規劃之01揹包問題

首先是問題描述 給定n種物品和一揹包,物品i的重量是wi,其價值是pi,揹包的容量是m,問如何選擇裝入揹包中的物品總價值最大?可以這樣理解 揹包的揹負有上限,因此在這個上限內盡可能多的裝東西,並且價值越多越好。在這裡我之想討論動態規劃解決這個問題的詳細過程。動態規劃是用空間換時間的一種方法的抽象。其...

動態規劃之0 1揹包問題

問題描述 現有n件物品和乙個容量為c的揹包。第i件物品的重量是重量為w i 價值是v i 已知對於一件物品必須選擇取 用1表示 或者不取 用0表示 且每件物品只能被取一次 這就是 0 1 的含義 求放置哪些物品進揹包,可使這些物品的重量總和不超過揹包容量,且價值總和最大。求解思路 0 1揹包問題的遞...

動態規劃之0 1揹包問題

問題描述 0 1揹包問題是應用動態規劃設計求解的典型例題 已知n種物品和乙個可容納c重量的揹包,物品i的重量為w i 產生的效益為p i 在裝包時物品i可以裝入,也可以不裝,但不可拆開裝。問如何裝包,所得裝包總效益最大。演算法分析 最優子結構特性 0 1揹包的最優解具有最優子結構特性。與一般揹包問題...