使人頭疼的揹包九講(2)徹底揹包問題

重磅乾貨,第一時間送達
使人頭疼的揹包九講(2)徹底揹包問題正則表達式

揹包問題是一個經典的動態規劃模型。它既簡單形象容易理解,又在某種程度上可以揭示動態規劃的本質,故很多教材都把它做爲動態規劃部分的第一道例題.算法

題目

徹底揹包問題數組

題目要求

有n個重量和價值分別爲wi,vi的物品,從這些物品中挑選出總重量不超過W的物品,求全部挑選方案中價值總和的最大值
1≤n≤100
1≤wi,vi≤100
1≤W≤10000微信

輸入:
整數用空格隔開 數據結構

第一行有兩個整數N,V 表明物品種數和揹包容積機器學習

接下來有N行,每行兩個整數用空格隔開,表明物品體積和價值ide

輸出:
在揹包容量下可以最大化的價值函數

輸入樣例學習

4 6
1 1
2 3
3 4
4 5

輸出樣例:3d

9

分析

與零一揹包不一樣的是,零一揹包中的物品是不能夠重複拿取的,只能夠拿取當前物品或者不拿取當前物品,不能夠拿取多個,徹底揹包的物品是能夠任意拿取多個的來構成不超過揹包容量而且構成的總價值是最大的

動態規劃的核心是找到dp公式或者狀態轉移的方程,理解清楚中間的過程是怎麼樣進行變化的,由於動態規劃老是要利用到以前歷史上的最佳方案,因此dp數組裏面存儲的確定是歷史上存儲的最佳方案,一開始的時候咱們是能夠藉助excel表格來幫助咱們理解dp數組是怎樣生成的

咱們能夠這樣想:當前個人揹包容量有多少,並且我能夠選擇的物品的範圍是什麼,那麼這兩個變量就能夠肯定一個值了,咱們能夠計算出當前揹包容量對於當前能夠選擇的物品範圍構成的最大價值

解題步驟

表格說明

  • 創建一個二維數組f[i][j],定義爲i爲遍歷到第i個物品的時候,j爲揹包的容量大小,j最大爲m,如f[2][3]指的就是遍歷到第二個物品下容量爲3的最大價值

表格

使人頭疼的揹包九講(2)徹底揹包問題
由輸入可知第一個物品爲1 1 即價值爲1,所佔的容量也爲1。

根據f[i][j]=max(f[i][j-w[i]]+v[i])可知,從第一個物品開始,因爲今天這個問題屬於徹底揹包問題,故兩層循環中,第一層循環爲遍歷物品,第二層循環爲從小到大擴大揹包容量不斷塞進更多的當前物品。

f[1][0]=max(f[1][0],f[1][0-1]+2) 不執行
執行 f[1][0]=f[0][0]
從上式能夠知道我咱們取不到f[1][0-1] 故加個判斷j>=w[i]便可,若知足就能夠加入物品,不知足就不更新仍維持0

f[1][1]=max(f[1][1],f[1][1-1]+2)
f[1][2]=max(f[1][2],f[1][2-1]+2)
f[1][3]=max(f[1][3],f[1][3-1]+2)
f[1][4]=max(f[1][4],f[1][4-1]+2)
f[1][5]=max(f[1][5],f[1][5-1]+2)

這樣第一個物品結束後,咱們來看看整個二維數組的更新狀況

使人頭疼的揹包九講(2)徹底揹包問題
f[1][5]就表示了在選擇第一個物品的時候,容量爲5的狀況下的最大價值爲5


接下來更新第二個物品

加個判斷j-w[i]>=0,若知足就能夠加入物品,不知足就不更新仍維持0

f[2][0]=max(f[2][0],f[2][0-2]+3) 不執行
故執行f[2][0]=f[1][0]
f[2][1]=max(f[2][1],f[2][1-2]+3) 不執行
故執行f[2][1]=f[1][1]

f[2][2]=max(f[2][2],f[2][2-2]+3)
f[2][3]=max(f[2][3],f[2][3-2]+3)
f[2][4]=max(f[2][4],f[2][4-2]+3)
f[2][5]=max(f[2][5],f[2][5-2]+3)

這樣第二個物品結束後,咱們來看看整個二維數組的更新狀況

使人頭疼的揹包九講(2)徹底揹包問題

以此類推最後獲得整個二維數組的狀況爲

使人頭疼的揹包九講(2)徹底揹包問題

代碼

Python :

1a=input()
 2n, m=list(map(int, a.split()))
 3w=[0 for i in range(n + 1)]
 4v=[0 for i in range(n + 1)]
 5f=[0 for i in range(m + 1)]
 6for i in range(1, n + 1):
 7    b=input()
 8    w[i], v[i]=list(map(int, b.split()))
 9
10for i in range(1, n + 1):
11    for j in range(1, m + 1):
12        if j >= w[i]:
13            f[j]=max(f[j], f[j - w[i]] + v[i])
14            # 這個是考慮到能夠選取多個物品的狀況
15
16print(f[-1])

C++

1int main(){
 2    int N,V;
 3    cin>>N>>V;
 4    vector<int> weight(N+1),value(N+1);
 5    for(int i=1;i<=N;i++)
 6        cin>>weight[i]>>value[i];
 7    vector<vector<int>> dp(N+1,vector<int>(V+1,0)); 
 8    for(int i=1;i<weight.size();i++){
 9        for(int j=0;j<=V;j++){
10
11            dp[i][j]=dp[i-1][j];
12
13            if(j-weight[i]>=0) 
14                dp[i][j]=max(dp[i-1][j],dp[i][j-weight[i]]+value[i]);
15        }
16    }
17    cout<<dp[N][V]<<endl;
18}
19

後記

2020大廠筆試 | 網易提早批(1)

2020大廠筆試 | 網易提早批(2)

使人頭疼的揹包九講(1)0/1揹包

數據結構類題目

  • LinkedList
  • 003-從尾到頭打印鏈表
  • 014-鏈表中倒數第k個結點
  • 015-反轉鏈表
  • 016-合併兩個或k個有序鏈表
  • 025-複雜鏈表的複製
  • 036-兩個鏈表的第一個公共結點
  • 055-鏈表中環的入口結點
  • 056-刪除鏈表中重複的結點
  • Tree
  • 004-重建二叉樹
  • 017-樹的子結構
  • 018-二叉樹的鏡像
  • 022-從上往下打印二叉樹
  • 023-二叉搜索樹的後序遍歷序列
  • 024-二叉樹中和爲某一值的路徑
  • 026-二叉搜索樹與雙向鏈表
  • 038-二叉樹的深度
  • 039-平衡二叉樹
  • 057-二叉樹的下一個結點
  • 058-對稱的二叉樹
  • 059-按之字形順序打印二叉樹
  • 060-把二叉樹打印成多行
  • 061-序列化二叉樹
  • 062-二叉搜索樹的第k個結點
  • Stack & Queue
  • 005-用兩個棧實現隊列
  • 020-包含min函數的棧
  • 021-棧的壓入、彈出序列
  • 044-翻轉單詞順序列(棧)
  • 064-滑動窗口的最大值(雙端隊列)
  • Heap
  • 029-最小的K個數
  • Hash Table
  • 034-第一個只出現一次的字符
  • 065-矩陣中的路徑(BFS)
  • 066-機器人的運動範圍(DFS)
  • 具體算法類題目
  • 斐波那契數列
  • 007-斐波拉契數列
  • 008-跳臺階
  • 009-變態跳臺階
  • 010-矩形覆蓋
  • 搜索算法
  • 001-二維數組查找
  • 006-旋轉數組的最小數字(二分查找)
  • 037-數字在排序數組中出現的次數(二分查找)
  • 全排列
  • 027-字符串的排列
  • 動態規劃
  • 030-連續子數組的最大和
  • 052-正則表達式匹配(我用的暴力)
  • 回溯
  • 065-矩陣中的路徑(BFS)
  • 066-機器人的運動範圍(DFS)
  • 排序
  • 035-數組中的逆序對(歸併排序)
  • 029-最小的K個數(堆排序)
  • 029-最小的K個數(快速排序)
  • 位運算
  • 011-二進制中1的個數
  • 012-數值的整數次方
  • 040-數組中只出現一次的數字
  • 其餘算法
  • 002-替換空格
  • 013-調整數組順序使奇數位於偶數前面
  • 028-數組中出現次數超過一半的數字
  • 031-整數中1出現的次數(從1到n整數中1出現的次數)
  • 032-把數組排成最小的數
  • 033-醜數
  • 041-和爲S的連續正數序列(滑動窗口思想)
  • 042-和爲S的兩個數字(雙指針思想)
  • 043-左旋轉字符串(矩陣翻轉)
  • 046-孩子們的遊戲-圓圈中最後剩下的數(約瑟夫環)
  • 051-構建乘積數組

劍指offer刷題交流羣

掃碼添加微信,必定要備註研究方向+地點+學校+暱稱(如機器學習+上海+上交+湯姆),只有備註正確才能夠加羣噢。

使人頭疼的揹包九講(2)徹底揹包問題
▲長按加羣

使人頭疼的揹包九講(2)徹底揹包問題

相關文章
相關標籤/搜索