程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

【Day1】01背包問題|Python

編輯:Python

目錄

前言🫠

01背包知識點講解: 

模版例題: 

Python3代碼:


前言🫠

隨著Python語言的熱度上升,將來將會有越來越多的小伙伴入坑Python。因為它不僅是一門編程語言,更是一個強大的武器。對於非計算機專業的理工科學生來說,可以學不會C 但必須要懂Python。因為不管是 人工智能 / 深度學習 / 爬蟲 / 數據分析 等等領域都離不開對於Python的使用。

而深入了解並掌握一門編程語言,最好的方法就是學算法。y總曾舉過一個例子 如果做一個Django框架 寫一個Web網頁的難度是100分,那麼數據結構與算法就是5000分。而且算法 是入職幾乎必須掌握的知識 面試中常有用到。

本專欄的目的旨在於幫助想使用Python作為主語言的小伙伴快速上手數據結構與算法,因為目前用Python寫算法還不是很普遍,網上也很難找到相關的資源,大部分都是C++和Java的。對於剛入坑的小白而言,無疑是一件難事。

在本專欄中,共有三十講,都是一些經典算法或數據結構的入門。然而,相關算法的對應知識點我可能不會詳細進行講解,因為網上已經有很多優秀的講解了。但我會將這個數據結構或算法的Python實現展示出來 並配有模版例題。代碼會有詳細注釋,只要你懂Python語法,看過了這個算法的實現方式,我保證你能看得懂對應的Python代碼。

祝 學習愉快

01背包知識點講解: 

01背包
特點:每個物品僅能使用一次
重要變量&公式解釋
dp[i][j]:表示所有選法集合中,只從前i個物品中選,並且總體積≤≤j的選法的集合,它的值是這個集合中每一個選法的最大值.
狀態轉移方程
dp[i][j] = max(dp[i-1][j], dp[i-1][j-v[i]]+w[i])
dp[i-1][j]:不選第i個物品的集合中的最大值
dp[i-1][j-v[i]]+w[i]:選第i個物品的集合,但是直接求不容易求所在集合的屬性,這裡迂回打擊一下,先將第i個物品的體積減去,求剩下集合中選法的最大值.
問題
集合如何劃分

一般原則:不重不漏,不重不一定都要滿足(一般求個數時要滿足)

如何將現有的集合劃分為更小的子集,使得所有子集都可以計算出來.

模版例題: 

有 N 件物品和一個容量是 V 的背包。每件物品只能使用一次。

第 ii 件物品的體積是 vi,價值是 wi。

求解將哪些物品裝入背包,可使這些物品的總體積不超過背包容量,且總價值最大。
輸出最大價值。

輸入格式

第一行兩個整數 N,V,用空格隔開,分別表示物品數量和背包容積。

接下來有 N 行,每行兩個整數vi,wi,用空格隔開,分別表示第 i 件物品的體積和價值。

輸出格式

輸出一個整數,表示最大價值。

數據范圍

0<N,V≤1000
0<vi,wi≤1000

輸入樣例

4 5
1 2
2 4
3 4
4 5

輸出樣例:

8

Python3代碼:

# 讀入數據
N,V = map(int,input().split())
v = [] ; w = []
for i in range(N) :
a,b = map(int,input().split())
v.append(a) ; w.append(b)
# dp數組
dp = [0]*(V+1)
# 狀態轉移方程
# 這裡壓縮了一維狀態
for i in range(N) :
for j in range(V,v[i]-1,-1) :
dp[j] = max(dp[j],dp[j-v[i]]+w[i])
# 輸出結果
print(dp[V])


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved