成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

你覺得背包真的很簡單嗎?

開發 前端
有一個容量有限的背包,容量為w,以及m個待選擇的物品,每個只有一件。每個物品有一定的重量和價值,那么選擇哪些物品放入背包,可使選擇的物品總價值最大呢?

[[420643]]

01故事起源

有一個容量有限的背包,容量為w,以及m個待選擇的物品,每個只有一件。每個物品有一定的重量和價值,那么選擇哪些物品放入背包,可使選擇的物品總價值最大呢?

02問題解析

如果背包沒有容量限制,那肯定是把所有的物品都放入背包可使價值最大。

但現在背包比較小,只能選擇部分裝進背包,比如只能放一個,那就把鉆石裝進去。

很容易可以想到,盡量放重量小且單價高的物品,但怎么對問題進行一個嚴謹的建模呢,繼續往下分析。

03分析

背包有一個固定的容量,容量是1kg,或者2kg,或者3kg,其實具體的數量對問題的本質沒有影響。

 

對于物品來說,也就分兩種情況,要么放入背包,要么不放。

有m個物品,那總共就有2^m種選擇方式,很明顯這個數量很大,所以也不可能直接把所有的選擇方式枚舉出來。

04小問題過度大問題

假設背包容量為1kg,那可裝入的最大價值就是將手表裝入,其他的也裝不下。

如果有一個更大的背包,它的容量可以看成是2個小容量的背包的總和。

但它能裝入的價值卻不能簡單的直接分解為2個小背包,因為物品只有一個,這會導致物品重復。

所以對物品也再進行一次劃分,m個物品可以分解為m1+m2個,同時背包容量也分解為w1+w2。

再看上面左右兩邊,和原來的問題還是一樣的,本質不變,只是變成了數據規模更小的一個子問題。如果有了子問題的答案,那是不是就可以組合成更大規模的答案了呢?

我猜這里肯定有同學會說,這樣分解的小問題一定能得到最終大問題的最優解嗎?我們來嘗試證明一下。

05逆向思維

假設下面就是最終的最優解選擇的物品。

如果從某個位置砍一刀分開,保證w1和w2能裝下自己這邊的最終選擇物品,那最優解也就被分成了兩個小規模問題的最優解。這也說明如果枚舉了所有小規模最優解的組合方式,也一定能得到大規模的最優解。

06算法建模

根據上面的分析,現在問題就變得簡單了,直接按物品和重量拆分小問題,通過小問題遞推出大問題就行了。

設f[i][j]表示前i個物品背包容量為j時,能選擇的最大價值。w[i]表示第i個物品的重量,v[i]表示第i個物品的價值。

  • 裝不下第i個物品,則f[i][j]=f[i-1][j]
  • 能裝下第i個物品,則f[i][j]=max(f[i][j],f[i-1][j-w[i]]+v[i])

那為什么只需要從前i-1個物品遞推就行了呢,因為只需要有一種情況能得到最優解就夠了,并不需要把前面的所有劃分都枚舉出來。這其實就相當于把i個物品劃分成i-1個物品和1個物品時的情況。前面的子問題也已經包含在當前的解中了。

代碼實現

  1. int f[101][1001], w[101], v[101]; 
  2. int n, m; 
  3. int main() { 
  4.     cin >> m >> n; 
  5.     for (int i = 1; i <= m; ++i) { 
  6.         cin >> w[i] >> v[i]; 
  7.     } 
  8.     f[0][0] = 0; 
  9.     for (int i = 1; i <= m; ++i) { 
  10.         for (int j = 0; j <= n; ++j) { 
  11.             f[i][j] = f[i - 1][j]; 
  12.             if (j >= w[i]) { 
  13.                 f[i][j] = max(f[i][j], f[i - 1][j - w[i]] + v[i]); 
  14.             } 
  15.         } 
  16.     } 
  17.     cout << f[m][n] << endl; 
  18.     return 0; 

07總結

背包在動態規劃中是一個非常重要的系列,涉及的類型和變種也非常的多,今天講的01背包是最基本的一種,不過真正理解了01背包,對后續其它的背包也才能更好的掌握。

本文原創作者:小K,一個思維獨特的寫手。

 

責任編輯:武曉燕 來源: 小K算法
相關推薦

2022-02-14 21:31:00

用戶身份驗證

2022-03-04 17:21:29

Redux項目前端

2017-03-16 16:57:56

2024-07-15 08:02:37

2016-04-21 09:43:33

編程音樂

2010-02-23 16:21:24

Python Win

2010-03-02 17:22:46

Android技術

2018-07-09 08:35:45

Windows 10WindowsBug

2010-01-20 10:14:53

C++程序

2012-07-11 13:35:53

代碼

2017-02-07 15:25:39

5Gwifi上網

2010-02-06 10:34:11

Android生命周期

2010-03-17 14:50:06

智能交換機

2010-01-21 17:14:40

C++兼容

2010-03-10 11:14:56

智能交換機

2010-03-02 15:22:40

Android手機

2022-01-10 17:18:26

框架 RPC架構

2019-11-05 09:20:06

SQLiteLinux

2016-06-01 15:42:58

Hadoop數據管理分布式

2020-04-17 14:25:22

Kubernetes應用程序軟件開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一区二区三区在线观看视频 | 可以看黄的视频 | 成人国产毛片 | 俺去俺来也www色官网cms | 9191在线播放 | 日韩一级电影免费观看 | 国产精品一区二区久久久久 | 天天射天天干 | h网站在线观看 | 538在线精品 | 日韩欧美精品在线播放 | 嫩草视频在线 | 欧美成人一区二区 | 一区二区在线免费观看 | 国产成人99久久亚洲综合精品 | 久久国产成人 | 成人免费视频观看视频 | 成人精品国产免费网站 | 成人免费影院 | 在线观看中文字幕dvd播放 | 国产精品一区久久久 | 久久久精品影院 | 一区不卡在线观看 | 操亚洲| 欧美在线一区二区三区 | 狠狠躁天天躁夜夜躁婷婷老牛影视 | 亚洲一区二区av | 久久福利| 精品福利一区 | 伊人网综合 | 久久久久久国产精品久久 | 午夜播放器在线观看 | 九九伦理电影 | 日本在线免费看最新的电影 | 欧美一级高清片 | 91精品久久久久久久久 | 成人网址在线观看 | 日韩精品视频在线观看一区二区三区 | 在线成人一区 | 国产激情综合五月久久 | av中文字幕在线观看 |